如何使用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脚本为初始化的环境执行。