Last active
August 29, 2015 14:17
-
-
Save wedojava/3b7f06d13d6612a7232e to your computer and use it in GitHub Desktop.
[转]解决sudo: sorry, you must have a tty to run sudo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
在网上了解到可以如下解决: | |
1. 编辑 /etc/sudoers | |
1)Defaults requiretty,修改为 #Defaults requiretty,表示不需要控制终端。 | |
2)Defaults requiretty,修改为 Defaults:nobody !requiretty,表示仅 nobody 用户不需要控制终端。 | |
如果修改为 Defaults:%nobody !requiretty,表示仅 nobody 组不需要控制终端。 | |
其实只要注释掉)Defaults requiretty 那个就可以了。表示在执行的时候不打开终端。但是,有的shell必须要有终端才可以执行。这样显然是不行的。后来,又找到一片文章才搞定。下面为抄录的,仅为记录以后使用。 | |
有些程序/脚本可能在没有控制终端的环境下上执行(如系统启动服务时, Daemon, | |
或者是setsid启动的程序等) 但可能这个程序需要控制终端, 这这么办呢? | |
如我们的例子: 我们在linux启动时启动一个服务, 可是中间有个程序(旧的systemtap)使用了sudo | |
但sudo需要控制终端(当然可以通过修改sudo的配置文件, 但这样很对用户不友好啊) | |
例子: (setsid 启动的程序会失去控制终端) | |
# setsid sudo ls | |
sudo: sorry, you must have a tty to run sudo | |
(如果你的系统没有输出这句话, 那就是你的系统的sudo配置文件允许sudo可以在这个, | |
请确保已经设置了Defaults requiretty) | |
没有控制中断的时候, 打开控制终端是这样的效果: | |
# setsid head -c 0 /dev/tty | |
head: cannot open `/dev/tty' for reading: No such device or address | |
为了解决这个问题, 所以应该使用能创建(伪)控制终端的程序来启动你的程序如: script, expect | |
如: | |
# setsid script -c "sudo ls" /dev/null | |
或: | |
# setsid expect -c 'spawn sudo ls; expect' | |
#打开控制终端成功: | |
# setsid script -c 'head -c 0 /dev/tty' /dev/null | |
# setsid expect -c 'spawn head -c 0 /dev/tty; expect' | |
不过 setsid 跟 script 组合使用有着奇怪的bug, 我这段时间非常的depression, | |
这样对script, expect来说, 都是大材小用了 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment