如何以不同用户身份运行脚本的一部分?

如何以不同用户身份运行脚本的一部分?
#!/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"

相关内容