ユーザーを変更した後もスクリプトを実行し続けたいと思います。スクリプトは次のとおりです。
echo "xauth add" `xauth list | grep ${DISPLAY:10:2}` >> test.sh
水道水
./test.sh
test.shスクリプトはユーザーを変更した後に実行する必要がありますが、「sudo su」以降は./test.shコマンドは実行されません。私たちはこれを可能にすることができますか
答え1
スクリプト中にユーザーIDを変更してから、新しいユーザーでスクリプトを実行することはできません。
ただし、次のコマンドを使用して、他のユーザーとして別のコマンドまたはスクリプトを実行できますsudo
。
sudo ./test.sh
別のユーザーで複数のコマンドを実行する必要がある場合は、そのコマンドをスクリプトに追加するか、test.sh
1つまたは複数のコマンドのみを実行する必要がある場合は、以下を使用してください。
sudo sh -c './test.sh; other_command'
sudo
実行中のすべてのエントリが終了すると、sudo
コントロールは親スクリプト(呼び出しスクリプト)として返されます。
答え2
ユーザーの中間スクリプトを変更できますが、これを行うにはシェルに入力を提供する必要があり、古くて恐ろしいスタイルに移植できない可能性があり、sh
おそらく悪い考えでしょう。
$ cat changemidscript
who am i
sudo -i
who am i
$ bash < changemidscript
jhqdoe tty?? Oct 5 14:21
root tty?? Oct 5 14:21
$
しかし!bash changemidscript
あるいは、./changemidscript
両方とも上記と同じようには機能しません。これはstdinを介して入力を提供するだけでユーザーが変更できるようになり、その後のコマンドはユーザーに新しいコマンドになるため、これが悪い考えであることを再び示唆します。 (他の方法で使いたいとおっしゃいましたか?そうしなければなりません!)
strace
これが機能する理由を説明するのに役立ちます。シェルが入力を1行ずつ読み取るのが難しい場合があるため、1文字ずつ読み取るか(\n
検索時に読み込みを中止できるように)、バッファに読み込みます。その後、\n
見つかった場所に応じて、次の文字の各行の先頭に返されます。
答え3
編集:実際には、次のいずれかを実行したいsudo su -l -c ./test.sh
(ログインシェルが必要な場合)sudo ./test.sh
。
su
とのマニュアルページを見てくださいsudo
。