編集どうやら、問題は私がやるべきだったということでした
_su - postgres -c "commands, commands, commands"
_、
つまり、コマンド(su
の下)は影響を受けないため、コマンドをsu
の下にリストするのではなく、su
に渡します。 su
。 /編集
編集2:さらに良い解決策については、David Braunの回答を参照してください: https://stackoverflow.com/a/22947716/694469 ==
Vagrant bootstrapシェルプロビジョニングスクリプトでユーザー(_su - postgres
_)を切り替えることはできませんか?(なぜですか?)
私はそのようなスクリプトを書いています。そのスクリプトでは、次のことを行います。
_echo '===== Creating PostgreSQL databases and users'
su - postgres
psql -c "
create user SomeUserName password '...';
alter user ...;
"
_
ここで、psql
はユーザーpostgres
としてログインを試みる必要があります。ただし、_su - postgres
_は明らかに失敗し、シェルはユーザーrootとしてログインしようとします。 (どうやら、rootはVagrant bootstrapシェルスクリプトを実行するユーザーです。)
したがって、このエラーが表示され、psqlコマンドは呼び出されません。
psql:致命的:ロール「root」は存在しません
_su - postgres
_を_Sudo su - postgres
_に置き換えても効果はありません(スクリプトはすでにrootとして実行されていると思います)。
_su - postgres
_の前後にid
(現在のユーザーIDを出力)を追加し、id
はsu
の前後にuid=0(root) gid=0(root) groups=0(root)
を出力します。と呼ばれていました。私の知る限り、_su - postgres
_は無視されているのでしょうか。そして、特定のexit
は、後でrootユーザーに戻ろうとすると、bootstrapスクリプトを完全に終了します: -((
しかしながら。 _vagrant ssh
_を実行した後、_Sudo su - postgres
_を正常に実行し、psql
を開始できます。ただし、プロビジョニングスクリプト内からではありません。
(回避策は、(ユーザーをpostgresに切り替える代わりに)psql
を呼び出すときに_-h 127.0.0.1 --username postgres
_を指定することです。また、=のPostgreSQL信頼ベース認証を有効にします。 VMローカル接続。)
Vagrant Shellスクリプトでユーザーを切り替えることができるかどうかはわかりません。これは、スクリプトがプロビジョナーで実行されているときに入力できないユーザー入力が必要になる可能性があるためです...しかし、psqlコマンドでユーザーを指定しないのはなぜですか?
psql --username=postgres -c "..."
echo '===== Creating PostgreSQL databases and users'
su postgres << EOF
psql -c "
create user SomeUserName password '...';
alter user ...;
"
EOF
Vagrantプロバイダースクリプトを非ルートとして実行する方法を探しているときにこれを見つけました。観察された動作の説明を追加したいと思います。これは、読者が知るのに役立つ非常に基本的なUnixの知識です。
シェルスクリプトでプログラム(/ bin/sh、Sudo、suなど)を実行しても、プログラムが実行されているコンテキスト(作業ディレクトリ、実行中のユーザーなど)は変更できず、作成するプロセスのコンテキストのみを設定します( rootとして実行している場合は実行中のuidを変更します--uid0)。これが、cdがシェルに組み込まれているコマンドである理由でもあります。 suはsetuidプログラムです(コマンド「ls-l which su
」を試すときは「s」に注意してください)。これは、プログラムを実行しているユーザーとしてではなく、プログラムを所有しているユーザー(root)として実行されることを意味します。
LHPは正しいです:それは実際には浮浪者の問題ではありません。私はしばらく前にそれをする必要がありました、そしてこれが私がそれを解決した方法です:
#!/bin/bash
case $(id -u) in
0)
echo first: running as root
echo doing the root tasks...
Sudo -u vagrant -i $0 # script calling itself as the vagrant user
;;
*)
echo then: running as vagrant user
echo doing the vagrant user's tasks
;;
esac
これは誰かにとって役立つかもしれませんが、別の明白な解決策は、Sudoを使用して2番目のスクリプトを実行することです。
修正済み:Macattackに感謝します。私はstackoverflowで直接書き込みましたが、まだテストされていません。
編集:質問が編集され、その説明とほとんどの回答は、vagrantスクリプトでユーザーを切り替える方法ではなく、「適切なユーザーでpostgresデータベースを作成する方法」に焦点を当てています。