2013-05-27 8 views
27

編集どうやら、問題は、私は
su - postgres -c "commands, commands, commands"を行っている必要があることだった、
su以下)これらのコマンドが影響を受けないので、むしろsuの下にそれらを一覧表示しようとするよりも、suに任意のコマンドを渡され suによって。 /編集Vagrantブートストラップシェルスクリプトでユーザーを切り替えることはできますか?

編集2:https://stackoverflow.com/a/22947716/694469


私はベイグラントブートストラップシェルプロビジョニングスクリプトでユーザー(su - postgres)を切り替えることができません。でも、よりよい解決策を参照してくださいデビッド・ブラウンの答えは? (どうしてですか?)

私はそのようなスクリプトを書いています。そのスクリプトでは、私が行います

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

su - postgres 

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

psqlはユーザーpostgresとしてログインしようとしなければなりません。しかし、su - postgresは明らかに失敗し、シェルはユーザとしてルートとしてログインを試みます。 (どうやら、ルートはベイグラントブートストラップシェルスクリプトを実行するユーザーです。)

だから、このエラーが表示されるとpsqlコマンドが呼び出されていません。sudo su - postgressu - postgresの交換

psql: FATAL: role "root" does not exist

は、(効果がありません私は、スクリプトがすでにルートとして実行していると思います。)

私はsu - postgres前後のid(現在のユーザーIDを印刷している)、およびを追加しました10は、suの前後両方にuid=0(root) gid=0(root) groups=0(root)を印刷しました。だから私が言うことができる限り、su - postgresは無視されていますか?そして、後に、私はルートユーザーに切り替えるしようとしたときに、exit特定のは、vagrant sshを行った後、私がすることができるよ。

しかし完全:-(ブートストラップスクリプトを終了しsudo su - postgresうまく、次に起動。しかし、ないプロビジョニングスクリプト内からpsql

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

答えて

3

私は、スクリプトがプロビジョナで実行されているときに入力できないユーザー入力が必要な場合があるので、Vagrantシェルスクリプトでユーザーを切り替えることはできません...しかし、単にpsqlコマンドでユーザーを指定するのはなぜですか?

psql --username=postgres -c "..." 
+1

Re:「ユーザーの入力が必要な場合があります」 - それでは、私は考えなかった。ですから 'su - オプション'として '--command COMMAND'を指定してしまえば、最終的にはすべてが動作するかもしれません。私はそれをすべて説明していると思います。問題は、バージンに関連するものではなく、バッシュにあまり慣れていないということでした。 (?) – KajMagnus

+1

'--username'の提案に感謝します。 (私はその問題の最後に「回避策は '-h 127.0.0.1 --username postgres'を指定することです。) – KajMagnus

+0

ええ、申し訳ありませんが、答えにあまりにも迅速にhehe ... –

14

私はちょうど非ルートとしてベイグラントプロバイダのスクリプトを実行する方法を探している間にこれを発見し、読者のために有用であろう、非常に基本的なUnixの知識で観測された行動の説明を、追加したいと思います知っている。

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

+1

これはあなたがそれを回避する方法です:http://stackoverflow.com/questions/1988249/how-do-i-use-su-to-execute-the-rest-of -the-bash-script-that-that-user –

10

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に書きましたが、まだテストされていません。

EDIT:質問が編集されましたが、その説明と、ほとんどの回答は、迷惑メールスクリプトでユーザーを切り替える方法ではなく、「適切なユーザーでpostgresデータベースを作成する方法」に焦点を当てています。

+0

それぞれの 'case'の最後に' ;; 'がありません。それ以外のすばらしい解決策は、私が探していたものでした。 – Macattack

+0

行で '' 'を使用して、迷惑メールのユーザの仕事をエコーし​​てください!"正しい構文は、迷惑メールのユーザの仕事をしている '' echo ''' – Doka

+0

@Doka:あなたの主張を裏付けるドキュメンテーションは全くありません – olivecoder

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

su postgres << EOF 
psql -c " 
    create user SomeUserName password '...'; 
    alter user ...; 
    " 
EOF 
+1

ニース、それは動作します私はテストしました:-)質問からのリンクを追加しました – KajMagnus

+0

エラー:CREATE DATABASEは関数または複数コマンドの文字列から実行できません – Ichwardort

+0

個々の呼び出しで分割した後、 – Ichwardort

関連する問題