bashスクリプトを作成しようとしています。
- 別のユーザーにコンテキストを切り替える(この場合はルート)
- 一連のコマンドの実行私。ユーザーを作成し(発信者に対話的にユーザー名を求めるメッセージを表示します)両方。このユーザーのパスワードを設定してください
- 戻り値を取得
- その後、操作を続けて値を返します。
これまで << EOF入力(絵。 1)、関数(図2)、別のスクリプトをインポートまたは実行します(画像3)。しかし、まだ望む結果が得られていません。
sudo su - << 'EOF'
# do stuff...
EOF
絵。 1
function myfunc()
{
local myresult='some value'
echo "$myresult"
}
図2
sudo su - -c bash <(curl -fksSL https://<my-script-location>.sh)
画像3
答え1
sudo su - << 'EOF' # do stuff... EOF
これはうまくいきますが、1つの制限があります。スクリプトは標準入力を介してシェルに渡されるため、作成したいユーザー名を読み取るなど、他の目的には標準入力を使用できません。
標準入力を保存する簡単な方法は、シェルコマンドを引数として渡すことです。
これはsudo su
重複していることに注意してください。sudo
指定されたコマンドをrootとして実行することがsu
唯一の目的です。ログインシェルをrootとして実行する(ここではおそらく不要です)、rootとしてシェルを実行するには代わりに使用しますsudo -i
。sudo su -
sudo sh
sudo sh -c '
# do stuff...
'
これにより、シェルコードスニペットで一重引用符を使用することが厄介になります。'\''
一重引用符で囲まれたテキストの中に一重引用符を入れることができます。ここでドキュメント構造を維持するにはいくつかの方法があります。最も直接的な方法はhereドキュメントをアップロードすることです。他の記述子について。ただし、これを行うにはclosefrom_override
sudo設定でオプションを有効にする必要があり、デフォルトではそうではありません。sudo
stdin、stdout、stderr を除くすべてのファイル記述子はクローズされます。
sudo -C 3 sh -c '. /dev/fd/3' 3<<'EOF'
# do stuff...
EOF
このオプションが有効になっていないシステムにコードを移植するには、heredocからスクリプトを読み取り、それをシェルに引数として渡すことができます。
script=$(cat <<'EOF'
# do stuff...
EOF
)
sudo sh -c "$script"
あるいは、sudoedスクリプトを端末から読み取ることができるようにするには、標準入力としてスクリプト本文を渡すこともできます。このアプローチの1つの制限は、フルスクリプト入力のリダイレクトを許可しないことです。
sudo sh <<'EOF'
exec </dev/tty
# do stuff...
EOF
答え2
呼び出し側のユーザーが次のものをsudo
割り当てることができるとしますtty
。
Defaults someuser:requiretty
ansには、必要なコマンドをrootとして実行する権限が与えられています。
Cmnd_Alias STUFF = /usr/bin/passwd, /usr/sbin/useradd
someuser ALL = STUFF
呼び出しを含むスクリプトsudo
は対話型です。ユーザー名を場所パラメータとして渡すことができます。
sudo useradd $1
sudo passwd $1
通常どおり使用して返品状況を確認してください$?
。
答え3
su -c '. /dev/fd/4' 4<<\SCRIPT
...automated stuff here...
....then for interactive...
exec </dev/tty
SCRIPT
すべきこと。ニーズに合わせてカスタマイズしてください。ただし、コンテキストが切り替わって$?
操作が完了すると、シェルの戻り状態になります。