su -cを使用したときに発生するエラー:bash:このシェルにはジョブ制御がありません。

su -cを使用したときに発生するエラー:bash:このシェルにはジョブ制御がありません。

他のユーザーとして特定のコマンドを実行し、実行が完了したら(成功または失敗)、すぐにログアウトする必要があるスクリプトを作成しました。

-cコマンドを実行するために of を使用できることを読みましたsu。だから私は次のスクリプトを書いた。

#!/usr/bin/env bash

su - user2 -c "echo 'hurray' && exit"

コマンドを実行しますechoが、ログイン状態を維持してuser2ログアウトしません。logout代わりに試してみましたが、exitログイン状態は維持されます。コマンドuser1を呼び出してスクリプトを実行し、完了後にコントロールが返されるように実行する必要があります。suuser2user1

修正する

まあ、自動的にログアウトすることもできましたが、今回は一部のコマンドが実行されませんでした。たとえば、

コマンド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のオプションを使用して多くのコマンドを試しました。これらすべてのコマンドは正しい出力を生成しました。ただし、スクリプトを実行しようとするすべてのコマンドはエラーで失敗します。lswhichbash --versionmkdirrmwhoami

su user2 -c 'bash --version'      # Works
su user2 -c 'bash some-script.sh' # Doesn't work

なぜこれが起こるのかわかりません。これが私がこのエラーを解決できない理由でもあります。

答え1

この動作の理由は、最新バージョンのマニュアルページに記載されていますsu

-c, --command コマンド

シェルで使用することを指定します-c

実行されるコマンドは次のとおりです。制御端子なし。このオプションは、TTY制御を必要とする対話型プログラムを実行するためには使用できません。

(強調は私のもの)


lsecho、またはなどの基本コマンドを実行すると、制御端末が必要なく、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 login2012年5月にセキュリティ対策として制御端末の削除が導入されたことがわかります。

  • su:コマンドを実行すると、制御端末を削除して可能なttyハイジャック(CVE-2005-4890)を修正します。閉じる:#628843

関連情報