我尝试通过交互模式依次执行以下三个命令,一切正常。但是当我通过 shell 脚本使用同一个命令时,sudo 之后控制权被剥夺,第二个命令 ssh 不会在没有用户干预的情况下执行。
sudo su -s /bin/bash webuser
ssh -i /home/webuser/gcp/gcpusercer.pem [email protected]
telnet 1 3300
if [[ $1 == *"gcp"* ]]
then
sudo su -s /bin/bash webuser
ssh -i /home/webuser/gcp/gcpusercer.pem [email protected]
telnet 1 3300
fi
答案1
你的脚本有两个问题。
和
sudo
(ssh
除了通过 ssh 运行单个命令时)都是需要用户交互的命令。因此它们不能“仅仅”在脚本中运行。执行脚本中的命令依次。这意味着即使命令不需要用户交互,
ssh
命令也会被执行后由启动的 shell 完成sudo
,telnet
命令将被执行后ssh 会话结束。这可能不是您想要的。当您手动运行这三个命令时,您正在运行telnet
里面正在运行的 ssh 会话里面由 启动的 shellsudo
。要以编程方式执行相同的操作,您需要比 shell 脚本更高级的工具。您可以尝试使用预计例如。
一个可以完成您想要的操作的期望脚本的非常简单的“骨架”可能看起来像这样(当然,这没有经过任何方式的测试):
#!/usr/bin/expect
spawn sudo su -s /bin/bash webuser
expect "ssword:"
send "insert_sudo_password_here\r"
expect "$ "
send "ssh -i /home/webuser/gcp/gcpusercer.pem [email protected]\r"
expect "ssword:"
send "insert_ssh_password_here\r"
expect "$ "
send "telnet 1 3300\r"
interact
sudo
如果和/或命令中不需要密码ssh
,请删除查找密码提示的适当expect
/send
命令对并发送实际密码。