我写了一个脚本,它作为一个参数,一个字符串,它是一个用户名和一个项目的串联。该脚本应该开关(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

其他提示

许多简单的:使用sudo运行shell和使用定界符给它的命令。

#!/usr/bin/env bash
whoami
sudo -i -u someuser bash << EOF
echo "In"
whoami
EOF
echo "Out"
whoami

(回答上的超级用户)

使用的脚本像下面的下另一个用户执行脚本的其余部分或部分:

#!/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代替

修改:作为道格拉斯指出的那样,则不能使用cdsudo,因为它不是一个外部命令。你必须运行在一个子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脚本用于初始化的环境中执行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top