解決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

相關文章
相關標籤/搜索