如何以不同使用者身分執行腳本的一部分?

如何以不同使用者身分執行腳本的一部分?
#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

su - USER1 -c "
date | tee -a ${Log} 2>&1; 
cd /blah/blah
if [ SOMECONDITION ]
then
sh ./somescript.ksh > logfile
fi
exit" | tee -a ${Log} 2>&1;

當腳本切換到 USER1 時,它往往會停止,然後當我們必須手動退出時,它會再次執行。

答案1

我希望腳本在“su”命令處停止,因為它提示輸入密碼但沒有得到密碼。

通常有多種解決方案:)

使用“sudo”代替“su”,它具有 -S 開關來接受來自標準輸入的密碼:

echo "password" | sudo -S -u USER1 sh -c "...

或者,將需要以不同使用者身分執行的應用程式/腳本部分移至幫助應用程式。然後,您可以透過在該幫助程式應用程式上使用 set-uid 和 set-gid 來避免使用儲存的明文密碼(這有一些安全問題)編寫腳本:

chown USER1.GRP1 helperapp
chmod 6755 helperapp

這樣做的風險是,現在系統上的任何人都可以以 USER1 身分執行 helperapp。除了使用 set-uid/gid 之外,您還可以使用 configure sudo 來允許特定使用者以 USER1 身分執行 het helperapp,而無需密碼提示(這需要 admin/root 權限):

# /etc/sudoers
# Allow USER2 to run helperapp as USER1 without prompting for a password
USER2 ALL=(USER1) NOPASSWD:/path/to/helperapp

然後你的程式碼看起來像這樣:

#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

sudo -u USER1  /path/to/helperapp |  tee -a ${Log} 2>&1;

這些都沒有經過測試,使用時後果自負......

答案2

由於您正在運行su -,因此您正在告訴su運行登入 shell。登入 shell 忽略其-c參數並以互動方式讀取命令。解決辦法就是不通過-

如果您想讀取目標使用者的啟動文件,請明確執行此操作。

su - USER1 <<EOF
date
if [ -e ~/.profile ]; then . ~/.profile; fi
EOF 2>&1 | tee -a -- "$LOG"

相關內容