linux - 将 'sed' 到 'spawn' 执行到预期脚本中

标签 linux ssh expect

我正在编写一个简单的 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:权限被拒绝”

最佳答案

  1. 同样,我不是 expect 专家,但您的脚本看起来会在您的 上生成 chmodsed >local 机器,而不是在您的远程机器上。您不应该使用 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 ...由我自己。

关于linux - 将 'sed' 到 'spawn' 执行到预期脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619290/

相关文章:

linux - 将网页保存到本地框

linux - 如何从 Bash Shell 脚本中的文件执行命令列表

git - 被 gitolite 锁定并且无法 gl-admin-push

testing - 用于二进制协议(protocol)测试的类似 Expect 的工具

linux - 使用 bash one liner 创建别名

linux - 使用模式将带有数字的字符串加 1

linux - ssh 登录时可用的服务器列表

ssh - telnet/SSH 连接到底发生了什么?

ssh - 未提供用于ssh登录的密码

linux - 期望登录后运行 shell 命令