以下のシェルスクリプトを使用してrootとしてログインしようとすると、エラーが発生します。
su: must be run from a terminal
スクリプト(scriptfile.sh
)は次のとおりです。
su -s <<EOF
echo Now i am root
whoami
EOF
端末でsu
これを正常に実行できますが、デフォルトではrootとしてログインしています。
参考までにsu
:に置き換えると、同じスクリプトが正しく機能しますsudo
。私はこのスクリプトをrootではなく通常のユーザーとして実行しています。
エラーの考えられる原因は何ですか?この問題をどのように解決できますか?
注:ファイルに触れることなく実行したいです/etc/sudoers
。
ベストアンサー1
これまで私が検索したのは構文/対話型シェルである可能性が高いですが、専門家ではありません!
技術的にはsuをシェルスクリプトで使用してはいけませんが、sudoはより安全ですが、次は私にとって効果的でした。
これは働きます:
#!/bin/bash
exec su root --command 'echo -e "hello world" >> "/home/parallels/rootWasHere.txt"'
これも本当です:
#!/bin/bash
runAsRoot="
printf \"\nhey there\n\"
printf \"\nhello world, I am root\n\" >> \"/home/parallels/rootWasHere.txt\"
"
exec su root -c "$runAsRoot"
また、suの-sオプションはマニュアルに従ってシェルのみ指定されている。だからといって、後で-sに渡された内容も実行するという意味ではありません。したがって、次のことができるようです。
#!/bin/bash
runAsRoot="
printf \"\nhey there\n\"
printf \"\nhello world, I am root and my shell is \$SHELL\n\" >> \"/home/parallels/rootWasHere.txt\"
"
exec su root -s /bin/zsh -c "$runAsRoot"