如何使用su执行bash脚本为用户的休息吗?
-
22-09-2019 - |
题
我写了一个脚本,它作为一个参数,一个字符串,它是一个用户名和一个项目的串联。该脚本应该开关(SU)的用户名,cd到基于项目的字符串的特定目录中。
我基本上想做的事:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
问题是,一旦我做一个苏...它只是等待在那里。这是有道理的,因为执行流程已通过以切换到用户。一旦我退出,那么剩下的事情执行,但它不工作如期望。
我前缀su到svn命令但命令失败(即,它没有在目录中没有更新的svn需要)。
如何写一个脚本,允许用户切换用户和调用的svn(除其他外)?
解决方案
诀窍是用“须藤”命令而不是“ス”
的您可能需要添加这种
username1 ALL=(username2) NOPASSWD: /path/to/svn
到/ etc / sudoers文件
和改变你的脚本:
sudo -u username2 -H sh -c "cd /home/$USERNAME/$PROJECT; svn update"
在哪里USERNAME2是要运行SVN命令作为和USERNAME1被用户运行该脚本的用户。
如果您需要多个用户运行此脚本,使用%groupname
代替USERNAME1
其他提示
使用的脚本像下面的下另一个用户执行脚本的其余部分或部分:
#!/bin/sh
id
exec sudo -u transmission /bin/sh - << eof
id
eof
您需要执行所有不同用户的命令作为自己的脚本。如果它只是一个或几个命令后,随即开始应该工作。如果它的很多命令那么它可能最好将其移动到自己的文件。
su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME"
下面是另一种方法,这是在我的情况比较方便(我只是想放弃root特权和受限用户做我的脚本的其余部分):你可以使脚本重新启动本身正确的用户。让我们假设它最初是作为root运行。然后,它会是这样的:
#!/bin/bash
if [ $UID -eq 0 ]; then
user=$1
dir=$2
shift 2 # if you need some other parameters
cd "$dir"
exec su "$user" "$0" -- "$@"
# nothing will be executed beyond that line,
# because exec replaces running process with the new one
fi
echo "This will be run from user $UID"
...
使用sudo
代替
修改强>:作为道格拉斯指出的那样,则不能使用cd
在sudo
,因为它不是一个外部命令。你必须运行在一个子shell命令,使cd
工作。
sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"
<击> 撞击>
<击>sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update
击> <击> 撞击>
您可能会被要求输入该用户的密码,但只有一次。
这是不可能的外壳脚本中改变用户。使用在其他的答案中描述sudo的解决办法可能是你最好的选择。
如果你疯了足以运行Perl脚本作为root,你可以用持有的实际变量$< $( $> $)
/有效的UID / GID,e.g做到这一点:
#!/usr/bin/perl -w
$user = shift;
if (!$<) {
$> = getpwnam $user;
$) = getgrnam $user;
} else {
die 'must be root to change uid';
}
system('whoami');
这为我工作
从我的“启动”分裂出来我的“供应”。
# Configure everything else ready to run
config.vm.provision :shell, path: "provision.sh"
config.vm.provision :shell, path: "start_env.sh", run: "always"
然后在我start_env.sh
#!/usr/bin/env bash
echo "Starting Server Env"
#java -jar /usr/lib/node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-2.40.0.jar &
#(cd /vagrant_projects/myproj && sudo -u vagrant -H sh -c "nohup npm install 0<&- &>/dev/null &;bower install 0<&- &>/dev/null &")
cd /vagrant_projects/myproj
nohup grunt connect:server:keepalive 0<&- &>/dev/null &
nohup apimocker -c /vagrant_projects/myproj/mock_api_data/config.json 0<&- &>/dev/null &
由想法的启发来自@ MarSoft 但我改变像下面的行:
USERNAME='desireduser'
COMMAND=$0
COMMANDARGS="$(printf " %q" "${@}")"
if [ $(whoami) != "$USERNAME" ]; then
exec sudo -E su $USERNAME -c "/usr/bin/bash -l $COMMAND $COMMANDARGS"
exit
fi
我已经使用sudo
允许脚本的密码少执行。如果您想为用户输入密码,取出sudo
。如果你不需要从sudo的环境变量,删除-E
。
在/usr/bin/bash -l
确保,该profile.d
脚本用于初始化的环境中执行。