如何在bash脚本中使用Expect和send命令执行sudo命令?

sas*_*uke 10 bash sudo scripts

任何人都可以让我知道如何执行sudo命令expect吗?我尝试了以下操作,但这不起作用。任何人都可以给我建议吗?

set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "#"
send "output=$(sudo virsh list --all | awk "/running/{print \$2}" | tail -2); sudo virsh dominfo $output"
expect "password:"
send "$pw\r"
expect "#"
Run Code Online (Sandbox Code Playgroud)

当我尝试下面的脚本时,它执行没有错误,但我没有得到输出。这是脚本和执行时的输出。我在这里犯了什么错误?

set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
send {sudo virsh dominfo "$output"}    ;# don't know if you need quotes there
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
Run Code Online (Sandbox Code Playgroud)

执行

sasuke@njob:~$ ./hypr.sh 
spawn ssh sasuke@hostname 
sasuke@hostname's password: 
sasuke@hostname:~$ output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -10)sudo virsh dominfo '$output' sasuke@njob:~$
Run Code Online (Sandbox Code Playgroud)

gle*_*man 10

set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
send {sudo virsh dominfo "$output"}    ;# don't know if you need quotes there
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
Run Code Online (Sandbox Code Playgroud)

在 Tcl(以及,通过扩展,expect)中,花括号的作用类似于 shell 的单引号:禁止变量扩展。

在您可能看不到模式的情况下,expect 的多模式形式很有用。该exp_continue语句基本上在期望中“循环”,因此您可以发送密码并继续期待提示。由于没有与提示模式相关联的操作,因此控制从expect 命令传递到下一个命令。

我建议您将其另存为单独的脚本。第一行应该是

#!/usr/bin/expect -f
Run Code Online (Sandbox Code Playgroud)

如果要嵌入 shell 脚本:

#!/bin/sh
expect <<'END'
   # code as above
END
Run Code Online (Sandbox Code Playgroud)

请注意第一个“END”周围的引号——它具有单引号整个 here-document 的效果,因此您不必担心 shell 解释 Expect 变量