Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
osxbash&;期待_Bash - Fatal编程技术网

osxbash&;期待

osxbash&;期待,bash,Bash,我有一个脚本,它必须在多个主机中的每个主机上执行“sudo”操作。我正在努力让expect工作,所以我只需要进入它一次,并且遇到了几个问题 首先,几个示例建议使用: /usr/bin/expect <<EOD spawn ssh -t $host /usr/bin/sudo -v expect "Password:" send "$SUDOPASS\n" EOD 通过这种方式(并添加-d),我得到了关于no tty的错误,并且在结尾附加了一个“n”重复我的密码,因此它不会发送换行符

我有一个脚本,它必须在多个主机中的每个主机上执行“sudo”操作。我正在努力让expect工作,所以我只需要进入它一次,并且遇到了几个问题

首先,几个示例建议使用:

/usr/bin/expect <<EOD
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
EOD
通过这种方式(并添加-d),我得到了关于no tty的错误,并且在结尾附加了一个“n”重复我的密码,因此它不会发送换行符(我也尝试了“\r”),而是似乎在转义“n”

因为我发现的大多数示例都来自Linux,所以我希望(哈哈,双关语不是故意的!)它们使用的是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

除了跳过ssh的“-t”选项之外,它似乎大部分都在工作。我支持@BrianCain的评论,即无密码
ssh
w/
sudo
将是一个更好的解决方案。也就是说,让我们试着帮助您编写
expect
脚本,您可以决定它是否仍然是一个非常头痛的问题


我相信您在使用
bash
“here string”时会希望使用
expect-f-
(请阅读STDIN中的脚本)(
您是否考虑过完全绕过此选项,转而使用无密码
ssh
和/或
sudo
send "$SUDOPASS"\n
/usr/bin/expect -f - <<EOD
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
EOD