‘sudo: sorry, you must have a tty to run sudo’ 解决办法

在远程使用某用户执行 sudo 命令的时候,经常会遇到没有 tty 的问题,比如:

1
2
3
[gitlab-runner@tst10 ~]$ ssh asbuser@127.0.0.1 "sudo ls"
sudo: sorry, you must have a tty to run sudo
[gitlab-runner@tst10 ~]$

碰到此问题的原因是 sudo 配置文件中,禁止了远程 sudo 的执行,因为有泄漏密码的风险,官方解释如下:

Disable “ssh hostname sudo “, because it will show the password in clear.

但是对于已经做了互信的两台主机来说,是没有泄漏密码风险的。所以,如何才能在远程主机上执行 sudo 呢?

解决方式有两种,一种是根据官方提示,加上 -t 参数执行,比如:

1
2
3
4
[gitlab-runner@tst10 ~]$ ssh -t asbuser@127.0.0.1 "sudo ls"
ansible applications rundeck
Connection to 127.0.0.1 closed.
[gitlab-runner@tst10 ~]$

另一种方式,也就是网上比较多的一种解决方案,就是将 /etc/sudoers 配置中 requiretty 配置给屏蔽掉(建议使用 visudo 来更改):

1
2
3
4
5
#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults requiretty

屏蔽完后,就可以直接执行了:

1
2
3
4
5
[gitlab-runner@tst10 ~]$ ssh asbuser@127.0.0.1 "sudo ls"   
ansible
applications
rundeck
[gitlab-runner@tst10 ~]$