我正在编写一个简单的 expect 脚本 来访问远程服务器,而无需在命令窗口中引入密码。
我可以访问远程服务器,我想在那里修改一个文本文件。这个修改是用'sed'命令执行的,用于查找'keyword',这个'keyword'所在的行被删除。
给我问题的代码部分是“spawn”与“sed”的组合,如下所示
spawn sed -i -e '/keyword_to_delete/d' /home/my_file
由于这是在 expec 文件中进行的,因此我必须通过“spawn”命令来进行。我打开调试信息模式,屏幕上的主要错误信息是:
expect: set expect_out(buffer) "exit\r\nsed: -e expression #1, char 1: unknown command: `''\r\n"
cannot interact with self - set spawn_id to a spawned process
我希望我已经清楚且以一种很好的方式在这里展示了问题,如果没有告诉我,我会尽力做得更好。
非常感谢
代码:
set ip [lindex $argv 0]
set port [lindex $argv 1]
set password <PSWD>
proc sendPass {} {
global ip
global port
global password
spawn "/usr/bin/ssh" -X -p $port root\@$ip "-o StrictHostKeyChecking no" "-o UserKnownHostsFile /dev/null"
while {1} {
expect {
"IN" {break}
"Are you sure you want" {send "yes\r"}
"assword" {send "$password\r"}
}
}
spawn chmod 775 /etc/hosts
spawn sed -i -e {/operator/d} /etc/hosts
spawn sed -i -e {/default/d} /etc/hosts
send "exit\r"
expect eof
}; # end proc sendPass
#execute proc
sendPass
# script itself terminates
interact
当前错误是:“sed:无法打开临时文件/etc//sedDEb2Fx:权限被拒绝”
最佳答案
同样,我不是
expect
专家,但您的脚本看起来会在您的 上生成chmod
和sed
>local 机器,而不是在您的远程机器上。您不应该使用send chmod 775 ...
来代替,就像您使用send exit
在您的远程机器上执行exit
一样吗?This is how
sed -i ...
works .您会注意到您需要对将创建临时文件的/etc
具有写入权限。为避免这种情况,您需要不使用-i
显式创建一个临时文件,例如。sed -e/foo/d/etc/hosts >/tmp/hosts; mv/tmp/hosts/etc
.也许你需要cp
而不是mv
,但我不确定...我懒得尝试strace mv ...
由我自己。
关于linux - 将 'sed' 到 'spawn' 执行到预期脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619290/