どのように私は、そのユーザとしてbashスクリプトの残りを実行するためにsuコマンドを使用しますか?

StackOverflow https://stackoverflow.com/questions/1988249

質問

私は、引数、ユーザ名とプロジェクトの連結である文字列として、かかるスクリプトを書きました。スクリプトは、ユーザ名にスイッチ(SU)になっているプロジェクトの文字列に基づいて、特定のディレクトリにcdします。

私は基本的にやりたいます:

su $USERNAME;  
cd /home/$USERNAME/$PROJECT;  
svn update;  

問題は、私はsuコマンドを実行したら...それはただそこに待っていることです。これは、実行の流れは、ユーザーへの切り替えに渡されたので、理にかなっています。 I出口たら、その後、物事の残りは実行が、それは、必要に応じて仕事をしません。

私はSVNコマンドにSUを付加が、コマンドが失敗した(すなわち、それはディレクトリにSVNを更新しなかった望ましい)。

私は(特に)SVNスイッチのユーザへと呼び出しユーザーを可能にするスクリプトを書く方法を教えてください。

役に立ちましたか?

解決

トリックではなく、「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は、スクリプトを実行しているユーザーであるユーザーです。

このスクリプトを実行するために複数のユーザーが必要な場合は、代わりにUSERNAME1

%groupnameを使用

他のヒント

ずっと簡単:使用sudoは、シェルを実行し、それがコマンドを養うためにヒアドキュメントして使用します。

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

(答えはスーパーユーザの上、もともとhref="https://superuser.com/a/468163/33589">

を使用する他のユーザの下でのスクリプトの残りの部分または一部を実行するには、次のようなスクリプトます:

#!/bin/sh

id

exec sudo -u transmission /bin/sh - << eof

id

eof

あなたは、自分のスクリプトとしてすべての異なるユーザのコマンドを実行する必要があります。それはただ一つ、またはいくつかのコマンドだならば、インラインで動作するはずです。それは多くのコマンドだ場合、それは自分のファイルに移動し、おそらく最善です。

su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME" 
ここに私の場合に、より便利だったさらに別のアプローチで、(私はルート権限をドロップすると、制限されたユーザーからの私のスクリプトの残りの部分をやってみたかった)です:あなたは、スクリプトが正しいユーザーから自分自身を再起動することができます。のは、それが最初に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を使用することはできません、と指摘しました。あなたはcdの仕事をするためにサブシェル内のコマンドを実行する必要があります。

sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"

<ストライキ>

<ストライキ>
sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update

<ストライキ>

あなたが入力するように求められることがあり、そのユーザーのパスワードが、一度だけます。

これは、シェルスクリプト内のユーザーを変更することはできません。他の回答で説明sudoを使用して回避策は、おそらくあなたの最善の策です。

もしルートとしてPerlスクリプトを実行するためにしている怒っ十分な場合、あなたは本物の/実効uid / gidのホールド$< $( $> $)変数、例えばでこれを行うことができます。

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