繁体   English   中英

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

[英]Allow the use of SUDO when connecting to ssh through Net_SSH2

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

如果我要使用Net_SSH2通过SSH连接到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

有没有办法做到这一点?

谢谢你的帮助

如果我可以引用这篇文章,

已知Red Hat系统(RHEL,Fedora ...)在默认的sudoers文件中需要TTY。 这并没有提供真正的安全优势,可以安全删除。

红帽已确认该问题,它将在以后的版本中删除。

因此,删除“ requiretty”是安全的,这样您就可以通过SSH执行sudo命令了。

您也可以尝试使用-t选项运行ssh(可以在前面的文章中找到其影响),它会强制伪tty分配,因此它可能会起作用。 我不知道是否有办法将该选项添加到Net_SSH,但是它应该基于OpenSSH,因此通常应该这样做。 最坏的情况是,您可以始终通过exec运行ssh命令,但是删除require tty似乎是最好的选择。

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

有关更多信息,谷歌“ bash脚本中的sudo”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM