1. 程式人生 > >解決Jenkins執行shell指令碼時出現“sudo: no tty present and no askpass program specified”的錯誤

解決Jenkins執行shell指令碼時出現“sudo: no tty present and no askpass program specified”的錯誤

今天使用jenkins job執行呼叫指令碼執行CD task時,出現了“sudo: no tty present and no askpass program specified”的問題,網上找了很多,但大多都沒有解決我的問題。

問題描述:

寫好shell指令碼後,直接在宿主機直接使用"sudo ./product_env.sh"時,指令碼可以正常執行,但是在jenkins伺服器上,遠端呼叫此機器上的指令碼時,會丟擲:“sudo: no tty present and no askpass program specified”

解決:

修改sudo配置檔案,直接輸入命令“visudo”或“sudo visudo”:

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

找到“Defaults   !visiblepw”,直接將當中的“!”去掉(如果是被註釋的,就把“#”去掉),如果沒有就增加行:Defaults   visiblepw

否則就會出現:sudo: no tty present and no askpass program specified 錯誤

此外,我們也可以將Defaults requiretty註釋或修改為 #Defaults requiretty, 表示不需要控制終端。 

我們也可以賦予當前登入使用者(如:user1)執行某項服務的許可權,如:

如,增加行:user1 ALL=(ALL) NOPASSWD: /etc/nginx/sbin
注:NOPASSWD可以使在命令執行時不需要互動輸入user1使用者的密碼, 修改後重啟服務生效