29

編集どうやら、問題は、コマンド (以下) が の影響を受けないため、コマンドを下にリストしようとするのではなく
su - postgres -c "commands, commands, commands"
に渡す必要があったことです。/編集susususu

編集 2:さらに優れたソリューションについては、David Braun の回答を参照してください: https://stackoverflow.com/a/22947716/694469


su - postgresVagrant ブートストラップ シェル プロビジョニング スクリプトでユーザー ( ) を切り替えることはできませんか? (なぜだめですか?)

そんな脚本を書いています。そのスクリプトでは、次のことを行います。

echo '===== Creating PostgreSQL databases and users'

su - postgres

psql -c "
  create user SomeUserName password '...';
  alter user ...;
  "

ここでは、 psqluser としてログインを試みる必要がありますpostgres。ただし、これはsu - postgres明らかに失敗し、シェルはユーザーrootとしてログインしようとします。(明らかに、rootは Vagrant ブートストラップ シェル スクリプトを実行するユーザーです。)

したがって、このエラーが表示され、psql コマンドは呼び出されません。

psql: FATAL: ロール "root" が存在しません

に置き換えsu - postgresても効果はありません(スクリプトはすでにrootsudo su - postgresとして実行されていると思います。)

idの前後に (現在のユーザー ID を出力する)を追加し、呼び出された前後の両方su - postgresid出力します。私が知る限り、無視されていますか?そして、後でルートユーザーに戻ろうとすると、ブートストラップスクリプトが完全に終了します:-(uid=0(root) gid=0(root) groups=0(root)susu - postgresexit

でも。を実行した後、問題なく起動vagrant sshできるようになりました。ただし、プロビジョニング スクリプト内からではありません。sudo su - postgrespsql

(回避策は、(ユーザーをpostgresに切り替える代わりに)-h 127.0.0.1 --username postgresいつ呼び出すかを指定することです。また、VM ローカル接続に対して PostgreSQL 信頼ベースの認証を有効にします。)psql

4

4 に答える 4

14

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

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

于 2013-10-16T13:23:47.680 に答える
10

LHP は正しいです。これは実際には vagrant の問題ではありません。少し前にそれを行う必要がありましたが、これを解決した方法は次のとおりです。

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

于 2014-02-24T10:32:47.553 に答える
3

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

psql --username=postgres -c "..."
于 2013-05-27T12:54:38.967 に答える