web-dev-qa-db-ja.com

別のユーザーとしてシェルスクリプトを実行する

別のユーザーとしてシェルスクリプトを実行する良い方法は何ですか。私はDebian etchを使用しており、偽装したいユーザーを知っています。

私が手動で行っていた場合は、次のようにします。

su postgres
./backup_db.sh /tmp/test
exit

プロセスを自動化したいので、backup_db.shをpostgresとして実行する方法(環境の継承など)が必要です

ありがとう!

44
Wadih M.

1つのコマンドとして別のユーザーとしてスクリプトを実行するには、次のコマンドを実行します。

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

このようなスクリプトでは常にフルパスを使用することをお勧めします。suしたときに正しいディレクトリにいることを常に保証できるわけではありません(たぶん誰かがあなたのホームディレクトリを変更したことを知っています)。私は偏執狂なので、常にsu(/ bin/su)への絶対パスも使用します。誰かがあなたのパスを編集して、あなたにsuの侵害されたバージョンを使わせてしまう可能性があります。

69
baumgart

実行するターゲットユーザーにnologin shelllが定義されている場合は、-sオプションを使用してシェルを指定できます。

/bin/su -s /bin/bash -c '/path/to/your/script' testuser

次の質問を参照してください: nologinシェルを持つユーザーとしてスクリプトを実行します

23
Basil A

これをスケジュールに従って自動化するには、ユーザーのcrontabに配置します。ただし、cronジョブは完全な環境を取得しませんが、とにかくスクリプト自体に必要なすべてのenv変数を配置することをお勧めします。

ユーザーのcrontabを編集するには:

Sudo crontab -u postgres -e
9
Kyle Brandt

これは参考情報である必要があります- setuid on Shell scripts

suを「- username "引数シーケンスでは、ユーザーがログインシェルを作成して、ユーザーと同じ環境を提供します。通常、別のログインからホーム環境でスクリプトをすばやく実行するために使用されます。

3
nik

Suマンページを試してください:

su -c script_run_as_postgres.sh-postgres

代わりに、Sudoを使用して、パスワードなしでそのコマンドだけをpostgresとして実行できます。ただし、/ etc/sudoersでいくつかの設定が必要です。

2
pjz

他の人が投稿した "su -c ..."メソッドは良い方法です。自動化のために、実行に必要なユーザーのcrontabにスクリプトを追加できます。

2
Geoff Fritz

ユーザーがすでにSudoへのエントリを持っていて、スーパーユーザーのパスワードがわからない場合は、以下を試すことができます。これにより、/ data/my-db/pgsql/9.6/dataで初期化されたpostgresが再起動されます

Sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"
1
smishra

次のものも使用できます。

Sudo -u postgres script_run_as_postgres.sh

0
Xandersoft