これは私の単純な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つのスクリプトのエラーを解決するにはどうすればよいですか?
これを行うには多くの方法があります...ここにいくつかあります:
そのユーザーとしてログイン:実際には、
su user2
または単に同じ環境を取得し、
su -l user2
そのユーザーとして単一のコマンドを実行します。
su user2 -c cat myfile.txt
ここのドキュメントを使用してください:
Sudo su user <<EOF
command1
command2
.....
EOF
/tmp/script.shが実行可能でないため、またはone.shの最後のエコーに一致する頂点がないために、コマンドが失敗する可能性があります(")。
Sudo
を使用して、(元の)ユーザーに/tmp/script.shをパスワードなしで目的のユーザーとして実行する権限を付与します。
original_user ALL=(script_user) NOPASSWD: /tmp/script.sh
そのように呼び出します:
Sudo -u script_user /tmp/script.sh
それでも、誰でも書き込み可能なディレクトリに関連するものでそうするのはひどい考えです。あなたはそれをすることによってそれを求めているだけです。
私は答えを得ました ここ
この種のことを行うことは安全でも標準的な方法でもありません(実際、多くの人がそれを惨めだと考えています)。スクリプトにパスワードを入れるのは本当に良い考えではありません。より標準的なアプローチは、スクリプト全体がroot権限で実行されることを期待するか、スクリプトにパスワードの入力を求めるだけです。 /etc/suoders
のNOPASSWD
オプションを使用して、特定のユーザーがパスワードなしで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