web-dev-qa-db-ja.com

Bashからrootとしてログインして何かをする方法

これは私の単純なbashです:

cat test.sh

#!/bin/bash 
echo "hello"
su - root -c /path/to/script.sh <<EOF
password                              
EOF
whoami
echo "good bye"

しかし、私はこのエラーを受け取ります:

./test.sh
hello
su: must be run from a terminal
<current-user>
good bye

(または)

cat test2.sh
#!/bin/bash 
echo "hello"
Sudo su <<EOF
password                              
EOF
whoami
echo "good bye"

再び別のエラー

(または)

cat test3.sh
#!/bin/bash 
echo "hello"
su root <<EOF
password                              
EOF
whoami
echo "good bye"

再びエラー...

私が試してみると:

#!/bin/bash
echo "hello"
Sudo -s <<EOF
<password>
echo Now I am root
id                                                                      
echo "yes!"
EOF
whoami
echo "good bye"

次に、出力は次のとおりです。

./script.sh
hello
[Sudo] password for <user>:

また、スクリプトを次のように変更しました。

#!/usr/bin/expect -f
spawn Sudo -s <<EOF
expect "assword for user:"
send -- "password\r"
expect eof

出力は次のとおりです。

spawn Sudo -s <<EOF
[Sudo] password for user:
/bin/bash: <<EOF: command not found

またwhich sh出力は/bin/sh

これら3つのスクリプトのエラーを解決するにはどうすればよいですか?

3
MLSC

これを行うには多くの方法があります...ここにいくつかあります:

  1. そのユーザーとしてログイン:実際には、

    su user2

または単に同じ環境を取得し、

  su -l user2
  1. そのユーザーとして単一のコマンドを実行します。

    su user2 -c cat myfile.txt

  2. ここのドキュメントを使用してください:

    Sudo su user <<EOF

    command1

    command2

    .....

    EOF

/tmp/script.shが実行可能でないため、またはone.shの最後のエコーに一致する頂点がないために、コマンドが失敗する可能性があります(")。

7
MariusMatutiae

Sudoを使用して、(元の)ユーザーに/tmp/script.shをパスワードなしで目的のユーザーとして実行する権限を付与します。

original_user ALL=(script_user) NOPASSWD: /tmp/script.sh

そのように呼び出します:

Sudo -u script_user /tmp/script.sh

それでも、誰でも書き込み可能なディレクトリに関連するものでそうするのはひどい考えです。あなたはそれをすることによってそれを求めているだけです。

3
Daniel B

私は答えを得ました ここ

この種のことを行うことは安全でも標準的な方法でもありません(実際、多くの人がそれを惨めだと考えています)。スクリプトにパスワードを入れるのは本当に良い考えではありません。より標準的なアプローチは、スクリプト全体がroot権限で実行されることを期待するか、スクリプトにパスワードの入力を求めるだけです。 /etc/suodersNOPASSWDオプションを使用して、特定のユーザーがパスワードなしでSudoを介してさまざまなコマンドを実行できるようにすることもできます。

ただし、リスクを認識したので、Sudo -kSを使用して、Sudoにstdinからパスワードを読み取らせ、stdinから-を使用してbashにコマンドを読み取らせることができます。例えば:

Sudo -kS bash - << EOF
password
whoami
echo "Not a good idea to have a password encoded in plain text"
EOF
2
MLSC