2010-09-02 107 views
1

在我的shell腳本(bash)中,我想調用其他shell腳本。
我將我的腳本作爲user_A運行。 這些腳本的一個需要特殊處理:以其他用戶的名義運行交互式shell腳本

  1. 它來運行不同的用戶 (用戶_B)。這裏需要密碼。
  2. 它是交互式的,但不僅要求 的問題,而且要使用 su運行另一用戶(user_C)的名稱 中的另一個腳本。我也必須在此輸入密碼 。

我可以使用su調用這個腳本,但它的問題必須以某種方式回答。 「:stty的:不是打字機」,因爲它打印每個questons我不能進入任何

我打電話了特殊的腳本這樣

su user_B << ABC 
... 
special_script 
... 
ABC 

回答

1
#!/bin/bash 

main_for_root(){ 
    : 
} 
# ------------------------------------------------------------------------------ 
abs_path="$(readlink -f `dirname $0`)/$(basename $0)" 

# if [ `id -u` != 0 ] ; then 
if [ `whoami` != 'root' ] ; then 
    echo "[su -] run as root" 
    su -c"/bin/bash $abs_path [email protected]" 
    exit 0 
else 
    main_for_root [email protected] 
fi 

它適用於1個用戶,所以現在添加「如果......」的第二個用戶

1

運行腳本的其他用戶的另一種選擇是「 sudo'命令,爲了便於閱讀,可以將其視爲「超級用戶」。 -u參數提供用戶名信息。所以:

sudo -u user_B special_script

會提示輸入密碼的用戶_B。我從來沒有遇到過使用它運行交互式程序的問題。你可以通過visudo命令管理誰可以向誰請求。

0

您可以使用sudo並創建一個sudoers文件,它允許user_A以user_B的方式運行腳本。

這樣一行:

user_A  ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC 

將允許用戶_A做這樣

sudo -u user_B /usr/share/stuff/ABC 

東西不要求輸入密碼

0

su嘗試從終端得到一個密碼和需要tty設備,因此它可以調用ioctl來關閉按鍵回顯。由於標準輸入來自「here document」(ABC),所以試圖在文件描述符0上調用ioctl會產生「not a tty」。

如果你必須使用一個在這裏的文檔,而不是一個善意腳本,這樣做:

cat > /tmp/myscript.$$ <<ABC 
#!/bin/sh 
... 
ABC 
chmod +x /tmp/myscript.$$ 
sudo -u user_B /tmp/myscript.$$ 
0

您可能需要使用expect。其設計用於腳本交互。