📄 00000004.htm
字号:
再者,有一些已经写好的程式可以帮你这类与 pseudo-tty 有关的东西,所 <BR> 以你只要在 script 中执行这些程式就可以帮你处理这些东西。 <BR> <BR> 有两个方法可以取得 'expect': <BR> 1.送一封 email 给 <A HREF="mailto:library@cme.nist.gov">library@cme.nist.gov</A> 内容就写 "send <BR> pub/expect/expect.shar.Z" <BR> 2. <A HREF="ftp://ftp.cme.nist.gov/pub/expect/expect.shar.Z">ftp://ftp.cme.nist.gov/pub/expect/expect.shar.Z</A> <BR> <BR> 另一个做法是用一个就 pty 4.0 曾贴在 comp.sources.unix volume25的东 <BR> 西。这个程式会提供一个 pseudo-tty session 给需要 tty 的程式用。若使用 <BR> named pipe 配合 pty 4.0 来做上例,则看起来可能如下: <BR> <BR> #!/bin/sh <BR> /etc/mknod out.$$ p; exec 2>&1 <BR> ( exec 4<out.$$; rm -f out.$$ <BR> <&4 waitfor 'password:' <BR> echo "$2" <BR> <&4 waitfor 'password:' <BR> echo "$2" <BR> <&4 cat >/dev/null <BR> ) | ( pty passwd "$1" >out.$$ ) <BR> <BR> 上面的 'waitfor' 是简单的 C 程式,功用为等到 input 有与所等待的字串 <BR> 相同时再往下做。 <BR> <BR> 下面是一个更简单的做法,不过缺点是与 'passwd' 程式的互动可能无法同 <BR> 步。 <BR> <BR> #!/bin/sh <BR> ( sleep 5; echo "$2"; sleep 5; echo "$2") | pty passwd "$1" <BR> <BR>------------------------------ <BR> <BR>Subject: How do I find the process ID of a program with a particular name ... <BR>? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>3.10) 在 shell script 或 C 程式当中,要怎样才能找到某个程式的 process ID <BR> 呢? <BR> <BR> 在 shell script 当中: <BR> <BR> 没有现成的程式可以用来查询程式名称与 process ID 之间的对应。此外, <BR> 如果有对应的话,通常也都不太可信,因为可能会有多个 process 执行同一 <BR> 个名称的程式,而且 process 在启动之後仍可修改自己的名称。然而,如果 <BR> 您真的想要得知执行某个特定程式的所有 process, 可以利用以下命令行达 <BR> 成: <BR> ps ux | awk '/name/ && !/awk/ {print $2}' <BR> <BR> 您可以把 "name" 换成您想寻找的程式名称。 <BR> <BR> 这个命令行的基本观念是分析 ps 程式的输出,然後用 awk或grep等公用 <BR> 程式来搜寻具有特定名称的文字行,然後把这些文字行当中的 PID 栏位印 <BR> 出来。值得注意的是此例的命令行用了 "!/awk/" 以避免 awk 的 process 被 <BR> 列出来。 <BR> <BR> 您可能要根据您所用的 Unix 种类来调整 ps 所用的参数。 <BR> <BR> 在 C 语言程式里面: <BR> <BR> 在 C 的程式库里面一样没有(具有可携性)的函数可以找出程式名称与 <BR> process IDs。 <BR> <BR> 然而有些厂商提供函数让您能读取 Kernel 的记忆体,例如 Sun 提供了 <BR> kvm_ 开头的函数,Data General 则提供了 dg_ 开头的函数。如果您的系 <BR> 统管理员未限定 Kernel 记忆体的读取权力的话(一般只有 super user 或 <BR> kmem 群组里的人员才能读取 Kernel 记忆体),一般使用者也可以利用这 <BR> 些特殊函数来达到目的。然而,这些函数通常没有正式的文件说明,就算有 <BR> 的话也都写得艰深难懂,甚至会随著系统版本的更新而改变。 <BR> <BR> 有些厂商会提供 /proc 档案系统,此档案系统存在的方式为一个内含多个档 <BR> 案的目录。每个档名都是一个数字,对应於 process ID,您可以开启这个档 <BR> 案并且读取关於这个 process 的资讯。再次提醒一下,有时候您会因为存取 <BR> 权限的限制而无法使用这些功能,而且使用这些功能的方式也随著系统而 <BR> 变。 <BR> <BR> 如果您的厂商并没有提供特殊的程式库或者 /proc 来处理这些事,但是您又 <BR> 想要在 C 里面完成这些功能,那麽您可能要自己在Kernel 记忆体当中费心 <BR> 搜寻。如果您想看看这些功能在某些系统上是怎麽做到的,可以参考 ofiles <BR> 的原始程式,您可以从 comp.source.sources.unix 的历年归档文章当中取 <BR> 得。(有一个称为 kstuff 的套装程式曾经在 1991 年五月发表於 <BR> alt.sources,它可以帮您在 kernel 当中搜寻有用的资讯,您可以到 <BR> wuarchive.wustl.edu 利用匿名 ftp 取回 <BR> usenet/alt.sources/articles/{329{6,7,8,9},330{0,1}}.Z。) <BR> <BR>------------------------------ <BR> <BR>Subject: How do I check the exit status of a remote command executed via <BR>"rsh"? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>3.11) 我要怎样经由 rsh 执行远方指令时,检查远方指令的结束状态? <BR> <BR> 以下指令行是行不通的: <BR> <BR> rsh some-machine some-crummy-command || echo "Command failed" <BR> <BR> 如果 rsh 程式本身能成功地执行,那麽 rsh 程式的结束状态就是 0,但这 <BR> 也许不是您真正想要的结果。 <BR> 如果您想检查远方程式的执行状态,您可以试试Maarten Litmaath 於 1994 <BR> 年十月在 alt.sources发表的 "ersh" script,ersh 是一个呼叫 rsh 的 shell <BR> script,它会安排远方的机器回应远方指令的结束状态,并传回此结束状态。 <BR> <BR>------------------------------ <BR> <BR>Subject: Is it possible to pass shell variable settings into an awk program? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>3.12) 能不能把 shell 变数传进 awk 程式当中呢? <BR> <BR> 这个问题有两个可行的方法,第一个方法只是把程式当中需要用到此变数的 <BR> 地方直接展开,例如要得知您目前使用哪些 tty,可以使用: <BR> <BR> who | awk '/^'"$USER"'/ { print $2 }' (1) <BR> <BR> awk 程式的程式通常会用单引号括起来,因为 awk 程式里面经常会用到 $ <BR> 字元,如果使用双引号的话,shell 本身会解释这个字元。所以啦,在这种 <BR> 特殊情形下,我们想要 shell 解释 $USER 当中的 $ 字元时,就必需先用 <BR> 单引号把前半段的句子暂时括起来,然後用双引号把 $USER 括起来,再用 <BR> 单引号把随後的句子括起来。请注意,双引号在某些状况下可以略去不写, <BR> 也就是说,可以写成: <BR> <BR> who | awk '/^'$USER'/ { print $2 }' (2) <BR> <BR> 然而,如果 shell 变数的内容含有特殊字元或空白字元时,就不适用了。 <BR> <BR> 第二种把变数的设定传进 awk 的方式是利用 awk 当中一个无文件说明的 <BR> 功能,它允许您从命令列透过「假造的档案名称」来设定变
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -