通过Net_SSH2连接到ssh时允许使用SUDO

时间:2015-06-30 16:46:26

标签: php ssh phpseclib

从php连接时通过SSH执行Sudo命令时遇到问题,但是没有从常规终端连接

如果我在SSH上使用Net_SSH2连接到AWS计算机

            $ssh = new Net_SSH2($instanceIp);
            if ( ! $ssh->login('ec2-user', $key)) {
                $logger->error('Login Failed');
            }

我会收到此错误:sudo:抱歉,你必须有一个tty才能运行sudo

如果我直接从终端连接 ssh -i~ / Path / to-file-key.pem ec2-user@111.111.11.111 所以我可以毫无问题地运行任何sudo命令。

我不想从/ etc / sudoers中删除(我不想在服务器上有任何事情要做,我希望通过连接来完成)

Defaults    requiretty

没有它可以有办法吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

如果我可以引用this条,

  

众所周知,Red Hat系统(RHEL,Fedora ......)在默认的sudoers文件中需要TTY。这没有提供真正的安全性好处,可以安全地删除。

     

Red Hat已经承认了这个问题,并将在以后的版本中删除。

因此,删除" requiretty"是安全的,这样您就不会有通过SSH执行sudo命令的问题。

你也可以尝试使用-t选项运行ssh(你可以在前面提到的文章中找到它的反应),它强制伪tty分配,所以它可能有用。我不知道是否有办法将该选项添加到Net_SSH,但它应该是基于OpenSSH的,所以通常你应该这样做。 最糟糕的情况是,你总是可以通过exec运行ssh命令,但删除require tty似乎是最好的选择。

答案 1 :(得分:0)

phpseclib文档提供了如何使用sudo的示例:

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->read('username@username:~$');
$ssh->write("sudo ls -la\n");
$output = $ssh->read('#[pP]assword[^:]*:|username@username:~\$#', NET_SSH2_READ_REGEX);
echo $output;
if (preg_match('#[pP]assword[^:]*:#', $output)) {
    $ssh->write("password\n");
    echo $ssh->read('username@username:~$');
}

http://phpseclib.sourceforge.net/ssh/examples.html#sudo

如果您想尝试使用$ssh->exec(由于您未在帖子中提供完整代码而不清楚您正在做什么),您可以执行sudo visudo然后添加您要运行的用户名/脚本的条目。例如

username ALL=(ALL) NOPASSWD: /path/to/script

或者,你可以这样做:

echo "PASSWORD" | sudo -S /path/to/script

有关更多信息google“sudo in bash script”