我有一个交互式 shell 脚本,它在一个地方需要 ssh 到另一台机器(基于 Ubuntu)并以 root 身份执行某些操作(用户应该输入他的密码,但远程命令应该按照脚本中所述运行):
# ...
ssh remote-machine 'sudo ls'
# ...
但是,我总是收到此错误消息:
sudo: no tty present and no askpass program specified
好的,这很清楚。但我该如何规避这个问题?应该发生这样的事情:
$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:
/bin
/etc
/var
答案1
神奇的ssh
万能药,关键是添加标志-t
以强制 ssh 分配伪 tty:
ssh -t remote-server 'sudo ls'
答案2
此方法将在 ssh 之后使用 sudo 运行单个脚本:
假设我们有一个具有 sudo 功能的“远程”用户,并且我们有一个希望它以 root 身份执行的脚本。
1)在密码文件 /etc/passwd登录时使用:
remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh
2)在“login.sh”中,我们以“sudo”身份执行想要运行的脚本:
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
#Not running as root, so we execute "sudo"
sudo /usr/local/bin/script.sh
else
#We are already rooted, so "sudo" is not required.
/usr/local/bin/script.sh
fi
exit;
正常情况下,它会询问两次密码:ssh login + sudo。如果你只想输入一次,请尝试sudo 无需密码(不推荐)。<-请阅读 Boldewyn 的评论。
主要优点是“ssh”不需要任何其他参数(如 -t),并且 sudo 在服务器端强制执行。此外,一旦脚本退出,用户也会被注销。
它可能不是那么优雅,但它简单并且有效。
答案3
您可以运行以下命令获取无需交互的 root 访问权限:
ssh server " sudo command" < sudopassword.txt