解决sudo: sorry, you must have a tty to run sudo

前几天遇到一个问题,在一个终端中调用另外一个shell,始终是没法执行的,后来捕捉到报错信息为sudo: sorry, you must have a tty to run sudo,后来,在网上了解到能够以下解决:

1. 编辑 /etc/sudoers html

  1)Defaults    requiretty,修改成 #Defaults    requiretty,表示不须要控制终端。 linux

  2)Defaults    requiretty,修改成 Defaults:nobody !requiretty,表示仅 nobody 用户不须要控制终端。 shell

       若是修改成 Defaults:%nobody !requiretty,表示仅 nobody 组不须要控制终端。 ui

其实只要注释掉Defaults    requiretty 那个就能够了。表示在执行的时候不打开终端。可是,有的shell必需要有终端才能够执行。这样显然是不行的。后来,又找到一片文章才搞定。下面为抄录的,仅为记录之后使用。 spa

有些程序/脚本可能在没有控制终端的环境下上执行(如系统启动服务时, 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来讲, 都是大材小用了
                                
若是查看原文请点:http://blog.chinaunix.net/u1/57250/showart_516605.html
.net

相关文章
相关标签/搜索