SSH:执行sudo命令


44

我有一个交互式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

Answers:


52

奇妙ssh的事物可以治愈一切。重点是添加-t标志以强制ssh分配伪tty:

ssh -t remote-server 'sudo ls'

1
但是,PTY可能会使脚本混乱。ls例如,输出将包含\ r \ n结尾。
东武

1
解决此问题的简单方法是强制ls进入非终端模式。ls | cat会的-它会看到stdout是一个管道。在这个特定的问题中,这无关紧要,因为它显然打算从终端以交互方式运行-因此您可能需要列和颜色等等。
加布

0

该方法将在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在服务器端被强制使用。同样,脚本退出后,用户也将注销。

它可能不那么优雅,但它简单而有效。


哦哦 sudoers像这样将远程用户放置在服务器上的文件中是一场灾难。如果任何人以您的用户身份(例如,通过Web服务器)获得访问权限,则他可以立即成为root用户。谢谢,但是我一直在寻找解决方案,这些解决方案不会使我的服务器配置出现问题。如果您有解决方案,那将以某种方式神奇地重新使用SSH的身份验证来执行该sudo命令,那么我会更加感兴趣(也许会开始寻找SSH的替代品...)。
Boldewyn

@Boldewyn:是的,设置“不带密码的sudo”存在安全风险 ……这是一个可选步骤。我同意您的看法,如果SSH可以重新使用身份验证,则不需要这种“解决方案”。谢谢你的评论。
lepe 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.