通过'spawn'执行'sed'到期望脚本

时间:2012-03-08 14:35:00

标签: linux ssh expect

我正在编写一个简单的 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”

3 个答案:

答案 0 :(得分:4)

  1. 我再次不是expect的专家,但您的脚本看起来在您的本地计算机上看到了chmodsed,而不是在你的远程机器上。您是否应该使用send chmod 775 ...,就像您使用send exit在远程计算机上执行exit一样?

  2. 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上?