これは私の簡単な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つのスクリプトのエラーを解決するにはどうすればよいですか?
パスワードをパイプして、スクリプト内のコマンドで送信できます。
echo "password" | Sudo -S
ただし、コマンドラインでパスワードを送信することはお勧めできません。スクリプトからrootとしてログインする方法の詳細が必要な場合は、提供されている回答 here を確認できます。
ただし、実験的な目的の場合は、コマンドラインからパスワードを入力することを想定して使用できます。スクリプトは以下のように変更する必要があります。
#!/usr/bin/expect -f
spawn Sudo -s <<EOF
expect "assword for username:"
send -- "user-password\r"
expect eof
パスワードを入力した後、Enterキーを押す必要があるため、最後の行が必要です。 Tianが示唆したように、シェルスクリプトでrootパスワードを送信することはお勧めできません。
スクリプトにrootパスワードを埋め込むのは良い考えではありません。セキュリティの観点から、これがおそらくsuが最初に端末からパスワードを取得しようとする理由です。
Sudo
を使用する方がより適切なルートです。より柔軟で、特定のコマンドのみ、または特定のユーザーでさえ、パスワード(man Sudo
)。
@Ketanのリファレンスも読む価値があります。
I GOT ANSWER FROM here
この種のことを行うことは安全ではなく、標準的な方法でもありません(実際、多くの人がそれを危険だと考えています)。より標準的なアプローチは、スクリプト全体がroot権限で実行されることを単に期待するか、スクリプトにパスワードを要求させるだけです。 /etc/suoders
のNOPASSWD
オプションを使用して、特定のユーザーがパスワードなしでSudo経由でさまざまなコマンドを実行できるようにすることもできます。
ただし、リスクを認識したので、Sudo -kS
を使用してSudoにstdin
からパスワードを読み取らせることができます。
Sudo -kSs << EOF
password
whoami
echo "Not a good idea to have a password encoded in plain text"
EOF
/ etc/sudoersを試しましたか?
your_user ALL=(ALL) NOPASSWD: /path/to/script.sh
(編集:sudoedit/etc/sudoers)次に、次のコマンドを実行できます:
Sudo /path/to/script without password