博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sudo: sorry, you must have a tty to run sudo
阅读量:4922 次
发布时间:2019-06-11

本文共 1292 字,大约阅读时间需要 4 分钟。

使用不同账户,执行执行脚本时候sudo经常会碰到 sudo: sorry, you must have a tty to run sudo这个情况,其实修改一下sudo的配置就好了

vi /etc/sudoers (最好用visudo命令)

注释掉 Default requiretty 一行

#Default requiretty

:w!

意思就是sudo默认需要tty终端。注释掉就可以在后台执行了。

 

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'

 

转载于:https://www.cnblogs.com/wjoyxt/p/6429215.html

你可能感兴趣的文章
创建文件命令
查看>>
文件修改
查看>>
什么是jsonp?——使用jsonp解决跨域请求问题
查看>>
函数追加笔记
查看>>
转:Server.MapPath相关
查看>>
vim-echofunc
查看>>
[UE4]Button
查看>>
spi接口
查看>>
Hibernate学习笔记_关系映射
查看>>
enter键跨浏览器提交表单
查看>>
postgres开启慢查询日志
查看>>
HASHtable创建
查看>>
协议与非正式协议
查看>>
安装jdk+tomcat
查看>>
Python 多进程
查看>>
.ctor,.cctor 以及 对象的构造过程
查看>>
WordPress用户注册无法发送密码邮件怎么回事?
查看>>
Texture(ASDK)、ComponentKit、LayoutKit、YogaKit
查看>>
Linux常用指令
查看>>
python 修改文件名1.0
查看>>