どのように私は、そのユーザとしてbashスクリプトの残りを実行するためにsuコマンドを使用しますか?
-
22-09-2019 - |
質問
私は、引数、ユーザ名とプロジェクトの連結である文字列として、かかるスクリプトを書きました。スクリプトは、ユーザ名にスイッチ(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
代わりに
編集:としてダグラスは、それがの外部のコマンドではありませんので、あなたがcd
でsudo
を使用することはできません、と指摘しました。あなたは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
を保証します。