我有一个脚本,必须在每个主机上执行'sudo'操作。我试图期望工作,所以我只需要输入一次,并遇到了几个问题。OSX bash&expect
首先,几个例子建议使用:
/usr/bin/expect <<EOD
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
EOD
然而,当我进入第二个“<”,所有的报价中被搞砸了,我的脚本将有意想不到的结束时终止文件。这真的很奇怪,因为我使用与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,双关不用!)他们正在使用GNU expect,而我正在使用BSD expect。我正在阅读手册页,但“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
这似乎是主要工作,除了跳过'-t'选项ssh
你有没有考虑绕开这个完全赞成无密码的'ssh'和/或'sudo'? – 2013-02-26 19:26:18