#!/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"