如何使用su来执行该用户的其余bash脚本?
我写了一个脚本,它将一个string作为一个参数,这个string是一个用户名和一个项目的连接。 该脚本应该切换(su)到用户名,cd到基于项目string的特定目录。
我基本上想这样做:
su $USERNAME; cd /home/$USERNAME/$PROJECT; svn update;
问题是,一旦我做了一个su …它只是在那里等着。 自从执行stream程转换到用户以来,这是有道理的。 一旦我退出,其余的事情就会执行,但不能按需要工作。
我在svn命令前加了su,但命令失败了(也就是没有更新所需目录中的svn)。
如何编写一个脚本,允许用户切换用户并调用svn(等等)?
诀窍是使用“sudo”命令而不是“su”
你可能需要添加这个
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
更简单:使用sudo
运行一个shell并使用heredoc来为它提供命令。
#!/bin/bash whoami sudo -u someuser bash << EOF echo "In" whoami EOF echo "Out" whoami
( 最初在SuperUser上回答)
您需要执行所有不同的用户命令作为自己的脚本。 如果只是一个或几个命令,那么内联应该工作。 如果有很多命令,那么最好把它们移到自己的文件中。
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" "$@" fi echo "This will be run from user $UID" ...
改用sudo
编辑 :道格拉斯指出,你不能在sudo
使用cd
,因为它不是一个外部命令。 您必须在子shell中运行命令才能使cd
工作。
sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"
sudo -u $USERNAME -H cd ~/$PROJECT sudo -u $USERNAME svn update
您可能会被要求input该用户的密码,但只能input一次。
在shell脚本中不能更改用户。 在其他答案中描述的使用sudo的解决方法可能是您最好的select。
如果你疯狂地以root身份运行perl脚本,你可以用$< $( $> $)
variables来保存真实/有效的uid / gid,例如:
#!/usr/bin/perl -w $user = shift; if (!$<) { $> = getpwnam $user; $) = getgrnam $user; } else { die 'must be root to change uid'; } system('whoami');
这对我有效
我从我的“启动”中分离出“configuration”。
# 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' if [ $(whoami) != "$USERNAME" ]; then exec sudo su $USERNAME -c "/usr/bin/bash -l $0 $@" exit fi
我已经使用sudo
来允许密码更less的执行脚本。 如果您想为用户input密码,请删除sudo
。
/usr/bin/bash -l
确保profile.d
脚本为初始化的环境执行。