我有一个脚本必须在许多主机上执行'sudo'操作。我正试着期待工作,所以我只需要输入一次,并遇到了几个问题。
首先,有几个例子建议使用:
/usr/bin/expect <<EOD
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
EOD
但是,只要我输入第二个'&lt;',所有引用就会搞砸,我的脚本将以意外的文件结尾终止。这真的很奇怪,因为我使用与cat相同的机制来写出其他脚本中的文件。
其他例子表明:
/usr/bin/expect -c "
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
"
这样做(并添加-d到期望),我得到关于没有tty和重复我的密码的错误,并在末尾添加了'n',所以它没有发送换行符(我是尝试'\ r'也是如此),但似乎是逃避了'n'
由于我发现的大部分示例都来自Linux,我希望(ha,ha,pun不是故意的!)他们正在使用GNU期望,而我正在使用BSD。我正在阅读手册页,但是“spawn”这个词出现了很多次,在我偶然发现正确的实例之前可能还需要一段时间。
这是一个似乎最接近工作的结果:
flamingo:~ jnojr$ Scripts/getinfo_expect.sh
Assuming you have one 'sudo' password for all of your hosts, enter it now:
expect version 5.45
spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {67358}
expect: does "" (spawn_id exp7) match glob pattern "Password:"? no
Password:
expect: does "Password:" (spawn_id exp7) match glob pattern "Password:"? yes
expect: set expect_out(0,string) "Password:"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "Password:"
send: sending "password\n" to { exp7 }
argv[0] = /usr/bin/expect argv[1] = -d argv[2] = -c argv[3] =
spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v
expect Password: { send password\n }
set argc 0
set argv0 "/usr/bin/expect"
set argv ""
sudo: no tty present and no askpass program specified[/CODE]
这就是将'\ n'留在引号之外,如
send "$SUDOPASS"\n
除了跳过ssh的'-t'选项
之外,它似乎大部分都在工作答案 0 :(得分:5)
我是第二个@BrianCain的评论,无密码ssh
w / sudo
将是一个更好的解决方案。也就是说,让我们尝试帮助你的expect
脚本,你可以决定它是否仍然是一个令人头痛的问题。
我相信当你使用expect -f -
“here string”(bash
)将脚本输入到{时,你会想要使用<<
(从STDIN读取脚本) {1}}。所以:
expect