从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
没有它可以有办法吗?
感谢您的帮助
答案 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”