ユーザー変更後のスクリプトの実行の継続

ユーザー変更後のスクリプトの実行の継続

ユーザーを変更した後もスクリプトを実行し続けたいと思います。スクリプトは次のとおりです。

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.sh1つまたは複数のコマンドのみを実行する必要がある場合は、以下を使用してください。

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

関連情報