我編寫了一個腳本,該腳本應該以另一個用戶的身份執行某些命令,並且在執行完成後(成功或失敗)應該立即登出。
我讀到可以使用-c
ofsu
來執行命令。所以,我寫了一個像這樣的腳本:
#!/usr/bin/env bash
su - user2 -c "echo 'hurray' && exit"
它執行echo
命令,但保持登入狀態,user2
不會登出。我什至嘗試使用logout
而不是但它保持exit
登入狀態。user1
su
user2
user1
更新
好吧,我本來可以自動註銷,但這次有些命令沒有被執行。例如:
命令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
因此,每當我嘗試透過-c
of運行某些腳本時su
,它都會顯示上述錯誤。我已經嘗試了許多-c
帶有選項的命令,例如、ls
、which
、bash --version
、mkdir
等rm
。whoami
但是任何嘗試執行腳本的命令都會失敗並出現錯誤。
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