エラー:su:端末で実行する必要があります。

エラー:su:端末で実行する必要があります。

以下のシェルスクリプトを使用して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"

答え2

から引用https://netsec.ws/?p=337

python -c 'import pty; pty.spawn("/bin/sh")'

echo os.system('/bin/bash')

/bin/sh -i

perl —e 'exec "/bin/sh";'

perl: exec "/bin/sh";

ruby: exec "/bin/sh"

lua: os.execute('/bin/sh')

(From within IRB) exec "/bin/sh"

(From within vi) :!bash

(From within vi) :set shell=/bin/bash:shell

(From within nmap) !sh

答え3

シェルに以下を追加できます。

export TERM=xterm

関連情報