解決sudo: sorry, you must have a tty to run sudo 前幾天遇到一個問題,在一個終端中調用另一個shell,始終是無法執行的,後來捕捉到報錯資訊為sudo: sorry, you must have a tty to run sudo,後來,在網上瞭解到可以如下解決: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 lssudo: sorry, you must have a tty to run sudo(如果你的系統沒有輸出這句話, 那就是你的系統的sudo設定檔允許sudo可以在這個,請確保已經設定了Defaults requiretty)沒有控制中斷的時候, 開啟控制終端是這樣的效果:# setsid head -c 0 /dev/ttyhead: 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來說, 都是大材小用了