在Linux和Unix上 sudo:Sorry, you must have a tty to run sudo报错

时间:2020-01-09 10:42:09  来源:igfitidea点击:

我试图运行以下命令:ssh [email protected] sudo command1/path/to/file但是,显示错误如下:

sudo: sorry, you must have a tty to run sudo
sudo:对不起,您必须有一个tty才能运行sudo

或者

sudo: no tty present and no askpass program specified
sudo:不存在tty且未指定askpass程序

如何在基于Linux或者Unix的系统上解决此问题? 在Fedora,RHEL,CentOS,许多其他Linux发行版和类Unix系统中,出于安全方面的考虑,此操作将以明文形式显示密码。

Linux或者Unix bash shell的修复程序是什么?

您必须按以下方式运行ssh命令,以避免显示为sudo的错误:对不起,您必须具有tty才能运行sudo Error:

ssh -t hostname sudo command
ssh -t user@hostname sudo command
ssh -t [email protected] sudo command1 /path/to/file

-t选项强制伪伪分配。
这可用于在远程机器上执行任意基于屏幕的程序,这在例如实现菜单服务时非常有用。
即使ssh没有本地tty,多个-t选项也会强制tty分配。

sudoers文件中的requiretty选项

如果在sudo配置文件sudoers中设置requiretty,则sudo仅在用户登录到实际tty时运行。
设置此标志后,只能从登录会话运行sudo,而不能通过cron,shell/perl/python或者cgi-bin脚本等其他方式运行。
默认情况下,此标记在许多商店中设置。
编辑/etc/sudoers文件,执行:

# visudo

查找如下所示的行:

Defaults    requiretty

将该行注释掉或者删除该行:

#Defaults    requiretty

保存并关闭文件。

如何在不使用-t选项的情况下运行命令?

您可以使用su命令而不是sudo命令,如下所示:

## NOTE: RHEL/CentOS specific syntax ##
su --session-command="/path/to/command1 arg1 arg2"
 
## others ##
su -c '/path/to/command1 arg1 arg2'

或者

ssh [email protected] su --session-command="/path/to/command1 arg1 arg2" 
OR
ssh [email protected] su -c '/path/to/command1 arg1 arg2'

您可以使用相同的语法以Hyman用户身份运行/scripts/job5143:

ssh [email protected] su --session-command="/scripts/job1 /nas" Hyman
OR
ssh [email protected] su Hyman -c "/scripts/job1 /nas"

另一种选择是使用以下语法(请参见下面的注释):

echo -e "\n"|sudo -S command