![如何通过 ssh -t 远程运行 sudo 命令?](https://linux22.com/image/33293/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20ssh%20-t%20%E8%BF%9C%E7%A8%8B%E8%BF%90%E8%A1%8C%20sudo%20%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
ssh -t
我有一个通过并使用登录远程主机的脚本sudo service foo restart
。
要求是避免在远程主机上提示输入密码。远程主机通过 SSH 证书进行身份验证。远程主机上的文件sudoers
允许该用户使用NOPASSWD
.
然而,在我的测试过程中,系统提示我输入密码,这是不可接受的。如果我在没有-t
标志的情况下手动运行它,它就会起作用。然而,-t
旗帜却让一切都变得不那么重要。
有没有解决的办法?
答案1
也许禁用并运行该requiretty
选项sudoers
ssh
没有标志-t
(或与-T
)有效。
添加类似这样的内容sudoers
(未经测试):
Defaults:{your ssh user} !requiretty
将其与NOPASSWD
您已经使用的命令结合起来,您应该能够在不分配伪 tty 的情况下运行 sudo 命令。
您还可以更改requiretty
命令而不是用户。
答案2
生成 SSH 密钥并将其传输到远程主机。
使用以下命令生成 RSA SSH 密钥
[root@localhost ~] ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Hit ENTER Enter passphrase (empty for no passphrase): Hit ENTER Enter same passphrase again: Hit ENTER
/root/.ssh/id_rsa.pub
使用以下命令查找该密钥并将其传输到远程:ssh-copy-id -i /root/.ssh/id_rsa.pub root@remote:/root
现在尝试登录;它不会询问您的远程密码。
答案3
对我来说,这样工作得很好,但要注意: 伪终端不会被分配,因为 stdin 不是终端
ssh -t username@hostname1 << 'EOS'
sudo sh
hostname
EOS
Pseudo-terminal will not be allocated because stdin is not a terminal.
hostname1