他のユーザーとして特定のコマンドを実行し、実行が完了したら(成功または失敗)、すぐにログアウトする必要があるスクリプトを作成しました。
-c
コマンドを実行するために of を使用できることを読みましたsu
。だから私は次のスクリプトを書いた。
#!/usr/bin/env bash
su - user2 -c "echo 'hurray' && exit"
コマンドを実行しますecho
が、ログイン状態を維持してuser2
ログアウトしません。logout
代わりに試してみましたが、exit
ログイン状態は維持されます。コマンドuser1
を呼び出してスクリプトを実行し、完了後にコントロールが返されるように実行する必要があります。su
user2
user1
修正する
まあ、自動的にログアウトすることもできましたが、今回は一部のコマンドが実行されませんでした。たとえば、
コマンド1:
su user2 -c 'echo 1'
出力1:
1
その後、それ自体がログアウトされます。
コマンド2:
su user2 -c 'bash some-script.sh'
出力2:
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
-c
したがって、経由でいくつかのスクリプトを実行しようとするたびに、上記su
のエラーが表示されます。 、、、など-c
のオプションを使用して多くのコマンドを試しました。これらすべてのコマンドは正しい出力を生成しました。ただし、スクリプトを実行しようとするすべてのコマンドはエラーで失敗します。ls
which
bash --version
mkdir
rm
whoami
su user2 -c 'bash --version' # Works
su user2 -c 'bash some-script.sh' # Doesn't work
なぜこれが起こるのかわかりません。これが私がこのエラーを解決できない理由でもあります。
答え1
この動作の理由は、最新バージョンのマニュアルページに記載されていますsu
。
-c, --command コマンド
シェルで使用することを指定します
-c
。実行されるコマンドは次のとおりです。制御端子なし。このオプションは、TTY制御を必要とする対話型プログラムを実行するためには使用できません。
(強調は私のもの)
ls
echo
、またはなどの基本コマンドを実行すると、制御端末が必要なく、bash --version
単に出力をstdout
ストリームとして出力します。
メソッドがbash
対話型シェルとして呼び出されているか、some-script.sh
端末デバイス制御を必要とするコマンドが含まれているため、実行時にエラーが'bash some-script.sh'
発生すると疑われます。cannot set terminal process group (-1): Inappropriate ioctl for device
少し説明
ㅏ制御端子プロセスの場合、プロセスを開始した端末装置です。制御端末はプロセスグループに信号を送ることができる。これにより、Unixオペレーティングシステムのタスク制御タスクメカニズムで、プロセスグループ内のプロセスがフォアグラウンドまたはバックグラウンドで実行されるようになります。
コマンドの出力には、ps
各プロセスの制御端末が表示されます。たとえば、次のようになります。
$ ps
PID TTY TIME CMD
3614 pts/5 00:00:00 bash
31628 pts/5 00:00:00 ps
最近の変更
以前は、su -c
対話型シェルを実行していないときに制御端末が起動していました。私のUbuntuシステムでこれを実行すると、apt-get changelog login
2012年5月にセキュリティ対策として制御端末の削除が導入されたことがわかります。
- su:コマンドを実行すると、制御端末を削除して可能なttyハイジャック(CVE-2005-4890)を修正します。閉じる:#628843