web-dev-qa-db-ja.com

Vagrant bootstrapシェルスクリプトでユーザーを切り替えることはできますか?

編集どうやら、問題は私がやるべきだったということでした
_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を出力)を追加し、idsuの前後に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ローカル接続。)

29
KajMagnus

Vagrant Shellスクリプトでユーザーを切り替えることができるかどうかはわかりません。これは、スクリプトがプロビジョナーで実行されているときに入力できないユーザー入力が必要になる可能性があるためです...しかし、psqlコマンドでユーザーを指定しないのはなぜですか?

psql --username=postgres -c "..."
3
Matt Cooper
echo '===== Creating PostgreSQL databases and users'

su postgres << EOF
psql -c "
  create user SomeUserName password '...';
  alter user ...;
  "
EOF
23
David Braun

Vagrantプロバイダースクリプトを非ルートとして実行する方法を探しているときにこれを見つけました。観察された動作の説明を追加したいと思います。これは、読者が知るのに役立つ非常に基本的なUnixの知識です。

シェルスクリプトでプログラム(/ bin/sh、Sudo、suなど)を実行しても、プログラムが実行されているコンテキスト(作業ディレクトリ、実行中のユーザーなど)は変更できず、作成するプロセスのコンテキストのみを設定します( rootとして実行している場合は実行中のuidを変更します--uid0)。これが、cdがシェルに組み込まれているコマンドである理由でもあります。 suはsetuidプログラムです(コマンド「ls-l which su」を試すときは「s」に注意してください)。これは、プログラムを実行しているユーザーとしてではなく、プログラムを所有しているユーザー(root)として実行されることを意味します。

14
LHP

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データベースを作成する方法」に焦点を当てています。

10
olivecoder