web-dev-qa-db-ja.com

ttyなしでシェルをシミュレートする方法は?

SSHを介してメンテナンスしているシステムで問題が発生しています。 TTYを必要とするコマンドをテストすると、おそらくSSHセッションが原因で機能します。不明確な状況では、TTYが利用できず、Sudoのようなコマンドが原因で失敗する

(Sudo: sorry, you must have a tty to run Sudo)

SSHシェルで成功するため、問題が発生する前に追跡するのが困難になります。これは繰り返し発生する問題なので、TTYを提供しないシェルでスクリプトへの変更をテストする方法を探しています。

Ubuntu 19.04、CentOS 6、Debian 9でbashとkshを使用しています。

3
Karl Richter

Ttyはシェルでは提供されません(関係は逆です)。 ttyは端末エミュレーターによって提供されます。プログラムは2つの部分でターミナルから自分自身を「切り離す」ことができます(テストされたプログラムが実際にチェックするものに依存します)

  1. Stdin/stdout/stderr(通常は端末を指す)を閉じます。たとえば、/ dev/nullから入力をリダイレクトし、出力をファイルに送信するか、パイプを介して送信できます。

    true | myapp 2>&1 | cat
    
    myapp </dev/null |& cat
    
  2. Setsid()を呼び出して、controlling terminalから切り離します(そうしないと、/ dev/ttyからアクセスでき、プログラムがシェルのジョブ制御の対象になります)。シェルから同じ名前のツールを使用できます:

    setsid myapp
    

この2つを組み合わせると、次のようにテストスクリプトを実行できると思います。

true | (setsid ./testscript.sh) 2>&1 | cat

(setsid ./testscript.sh) </dev/null |& cat

(はい、かっこは意図的なものです– setsidツールがforkする必要がなくなり、予期せず「バックグラウンド」になります。)

6
user1686