使用 su -c 時拋出錯誤:bash:此 shell 中沒有作業控制

使用 su -c 時拋出錯誤:bash:此 shell 中沒有作業控制

我編寫了一個腳本,該腳本應該以另一個用戶的身份執行某些命令,並且在執行完成後(成功或失敗)應該立即登出。

我讀到可以使用-cofsu來執行命令。所以,我寫了一個像這樣的腳本:

#!/usr/bin/env bash

su - user2 -c "echo 'hurray' && exit"

它執行echo命令,但保持登入狀態,user2不會登出。我什至嘗試使用logout而不是但它保持exit登入狀態。user1suuser2user1

更新

好吧,我本來可以自動註銷,但這次有些命令沒有被執行。例如:

命令1:

su user2 -c 'echo 1'

輸出1:

1

然後它會自行註銷。

命令2:

su user2 -c 'bash some-script.sh'

輸出2:

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

因此,每當我嘗試透過-cof運行某些腳本時su,它都會顯示上述錯誤。我已經嘗試了許多-c帶有選項的命令,例如、lswhichbash --versionmkdirrmwhoami但是任何嘗試執行腳本的命令都會失敗並出現錯誤。

su user2 -c 'bash --version'      # Works
su user2 -c 'bash some-script.sh' # Doesn't work

我不明白為什麼會發生這種情況。這也是我無法修復此錯誤的原因。

答案1

最新版本的手冊頁中記錄了此行為的原因su

-c, --command 命令

指定將由 shell 使用其-c.

執行的命令將無控制終端。此選項不能用於執行需要控制 TTY 的互動式程式。

(強調我的)


ls當您執行、echo或等基本命令時bash --version,它們只需將輸出列印到stdout流中,而不需要控制終端。

我懷疑該方式bash正在被呼叫(作為互動式 shell)或some-script.sh包含需要控制終端設備的命令,因此運行'bash some-script.sh'會引發cannot set terminal process group (-1): Inappropriate ioctl for device錯誤。

一些解釋

A控制終端對進程來說,就是啟動該進程的終端設備。控制終端可以向進程組發送訊號,是 Unix 作業系統中作業控制的工作機制;作業控制允許進程組中的進程在前台或背景執行。

命令的輸出ps顯示每個程序的控制終端,例如,

$ ps

  PID TTY          TIME CMD
 3614 pts/5    00:00:00 bash
31628 pts/5    00:00:00 ps

su 最近的變化

過去,su -c在不運行互動式 shell 時確實會啟動控制終端。在我的 Ubuntu 系統上運行apt-get changelog login顯示,控制終端的刪除是在 2012 年 5 月作為安全措施引入的:

  • su:透過在執行命令時刪除控制終端來修復可能的 tty 劫持 (CVE-2005-4890)。關閉:#628843

相關內容