我正在编写一个简单的 expect脚本,用于访问远程服务器,而不会在命令窗口中引入密码。
我可以访问远程服务器,在那里我想修改一个文本文件。此修改是使用“ sed ”命令执行的,用于查找“关键字”,此“关键字”所在的行将被删除。
给我问题的代码部分是' spawn '和' sed '的组合是以下一个< / p>
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
我希望我能清楚地以一种很好的方式展示问题,如果没有告诉我,我会尽力做得更好。
非常感谢
CODE:
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:Permission denied”
答案 0 :(得分:4)
我再次不是expect
的专家,但您的脚本看起来在您的本地计算机上看到了chmod
和sed
,而不是在你的远程机器上。您是否应该使用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 ...
。
答案 1 :(得分:2)
单引号对Tcl没有特殊意义(这里是do have special meaning),所以你想要
spawn sed -i -e {/keyword_to_delete/d} /home/my_file
答案 2 :(得分:1)
抱歉,我对expect(1)
并不熟悉,因为我直接使用SSH进行此类任务:
ssh user@remote_server "sed -i -e '/keyword/d' /home/my_file"
如果您真的需要使用expect
与telnet或其他东西,请执行以下操作:将sed脚本保存在remote_server
的某个位置,例如/usr/local/bin/del_kw.sh
,然后按预期执行。我认为这是解决问题的更易于管理的方法。有什么理由你不能使用这种方法,例如。因为你的系统挂载在只读的rootfs上?