157

ユーザー名とプロジェクトを連結した文字列を引数として受け取るスクリプトを作成しました。スクリプトは、ユーザー名に切り替え (su)、プロジェクト文字列に基づいて特定のディレクトリに cd することになっています。

私は基本的にやりたい:

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

問題は、一度 su... を実行すると、そこで待機することです。実行の流れがユーザーへの切り替えに渡されたので、これは理にかなっています。終了すると、残りの処理が実行されますが、期待どおりに動作しません。

su を svn コマンドの先頭に追加しましたが、コマンドは失敗しました (つまり、目的のディレクトリで svn を更新しませんでした)。

ユーザーがユーザーを切り替えて svn を呼び出せるようにするスクリプトを作成するにはどうすればよいですか?

4

9 に答える 9

140

はるかに単純です: を使用sudoしてシェルを実行し、ヒアドキュメントを使用してコマンドを供給します。

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

(最初は SuperUser で回答)

于 2014-07-11T11:35:09.807 に答える
101

トリックは、「su」の代わりに「sudo」コマンドを使用することです

これを追加する必要があるかもしれません

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 の代わりにa を使用します。

于 2010-01-01T09:42:07.777 に答える
63

すべての異なるユーザー コマンドを独自のスクリプトとして実行する必要があります。コマンドが 1 つまたは少数の場合は、インラインで機能するはずです。コマンドが多い場合は、それらを独自のファイルに移動することをお勧めします。

su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME" 
于 2010-01-01T09:53:34.177 に答える
61

これは、私の場合により便利なさらに別のアプローチです (ルート権限を削除し、制限されたユーザーから残りのスクリプトを実行したかっただけです): スクリプトを正しいユーザーから再起動させることができます。このアプローチは、「ネストされたスクリプト」を使用sudoするよりも読みやすいです。su -c最初にルートとして開始されたとしましょう。次に、コードは次のようになります。

#!/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"
...
于 2015-04-30T13:36:57.790 に答える
59

次のようなスクリプトを使用して、スクリプトの残りまたは一部を別のユーザーで実行します。

#!/bin/sh

id

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

id

eof
于 2012-01-25T06:37:57.047 に答える
8

sudo代わりに使用

編集:ダグラスが指摘したように、外部コマンドではないためcd、 in を使用できません。機能させるには、サブシェルでコマンドを実行する必要があります。sudocd

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

sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update

そのユーザーのパスワードを入力するよう求められる場合がありますが、1 回だけです。

于 2010-01-01T09:42:24.980 に答える
7

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

$< $( $> $) root として perl スクリプトを実行したい場合は、実際の/有効な uid/gid を保持する変数を使用してこれを実行できます。たとえば、次のようになります。

#!/usr/bin/perl -w
$user = shift;
if (!$<) {
    $> = getpwnam $user;
    $) = getgrnam $user;
} else {
    die 'must be root to change uid';
}
system('whoami');
于 2010-01-01T11:33:02.133 に答える