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


42

別のユーザーとしてシェルスクリプトを実行する良い方法は何ですか。私はDebianエッチを使用していますが、どのユーザーになりすますかを知っています。

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

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

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

ありがとう!

回答:


67

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のときに正しいディレクトリにいることを常に保証することはできません(誰かがhomedirを変更したのかもしれません)。また、私は偏執的なので、常にsu(/ bin / su)へのフルパスを使用します。誰かがあなたのパスを編集し、suの侵害されたバージョンを使用させる可能性があります。


パスワードを常に入力する必要がありますか?どうすればそれを回避できますか?
-zjffdu

2
非rootユーザーとしてコマンドを実行している場合は、常にパスワードを入力する必要があります。パスワードを避けたい場合は、それを許可するようにsudoを構成できます。ただし、ユーザーがsuを実行できるようにsudoを構成すると、任意のユーザーになることができます。コマンド用のスクリプトを作成し、スクリプトのアクセス許可を700に設定し、rootが所有してから、sudoを構成して、ユーザーがその単一のスクリプトを実行できるようにすることをお勧めします。
baumgart

私は信じています-この答えはOPではうまくいくかもしれませんが、完全に正しいわけではありません。私の知る限りでは、両方-(または--login)を一緒に使用--command, -cしても実際にはログインセッションは開始されません-c。常に非ログインシェルを強制するからです。
ジャンメルツ

1
注:移植性のため- postgress、コマンドの最後に表示する必要があります。マニュアルページから:When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
ジョニー


9

これをスケジュールで自動化するには、ユーザーのcrontabに入れます。Cronジョブは完全な環境を取得しませんが、とにかくスクリプト自体に必要なすべてのenv変数を入れる方が良いかもしれません。

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

sudo crontab -u postgres -e

もっと説明してもらえますか?
サラヴァナクマル

3

これは有益な読み取りである必要があります- シェルスクリプトのsetuid

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


これは、一連のアクションを実行する必要がある場合に役立ちます。ただし、ほとんどのシステムサービスアカウントには、有効なホームパスとシェルを使用しないでください。
ダンカーリー

2

suマンページを試してください。

su -c script_run_as_postgres.sh-postgres

また、sudoを使用すると、パスワードなしでそのコマンドだけをpostgresとして実行できます。ただし、/ etc / sudoersでいくつかのセットアップが必要です。


2

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


1

ユーザーがすでに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"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.