私はいくつかのサーバーをSSHしようとし、各サーバーのSudo -l
出力を取得しようとしています。
以下は私が実行しているスクリプトです
#!/bin/bash
serverlist="/tmp/servers"
while IFS=, read -r server netgroup username user
do
ssh -tt -q root@$server Sudo -U $username -l < /dev/null
done < "$serverlist"
このエラーの原因として、このスクリプトの-tt
オプションが見つかりました。これについて何か考えはありますか?
また、1台のサーバーだけで次のコマンドを実行すると、このエラーが表示されないことに注意しました。
ssh -tt -q root@myserver Sudo -U cham01 -l
以下は、私が取得している完全なエラーメッセージです。tcgetattr: Inappropriate ioctl for device
tcgetattr: Inappropriate ioctl for device
normallyは、一部のプログラムが端末制御操作を実行しようとしたが、その標準I/Oストリームが端末に接続されなかったことを意味します。 ( tcgetattr
は端末制御操作を行うCライブラリ関数の名前であるため、これを知っています。)
ssh
の-tt
オプションのポイントは、プログラムがリモートホストで実行されることを保証することですis端末に接続し、stty
を印刷するとspeed 38400 baud; line = 0; -brkint -imaxbel
は、それがwasであることを示します。これは、これらのコマンドをmyサーバーで実行したときに得られるものです。
$ ssh myserver stty < /dev/null
stty: 'standard input': Inappropriate ioctl for device
$ ssh -tt myserver stty < /dev/null
speed 38400 baud; line = 0;
-brkint -imaxbel
Connection to myserver closed.
しかし、あなたが得ているのは
$ ssh -tt yourserver stty < /dev/null
tcsetattr: Inappropriate ioctl for device
speed 38400 baud; line = 0;
-brkint -imaxbel
tcsetattr
エラーは、stty
からのnotです。最初に何かが端末に関連したことを試みて失敗し、thenstty
が正常に実行されました。これは、シェルの起動スクリプトにバグがあり、「非対話式」に実行すると不適切な処理が行われ、このエラーが発生するyouareターミナルに接続されたコマンドを実行しています。これ以上手伝うことはできませんが、おそらく 同様の問題に関するこの古い回答 がいくつかの手がかりを提供します。
この回答ではnot解決策を提案します(エラーの原因はわかりません)が、代わりに、それを見つけるための強力な手段を提案します!
問題の原因を理解するには、strace
コマンドを使用できます。
_strace ssh -tt -q root@myserver Sudo -U cham01 -l < /dev/null
_
どちらがエラーの原因となるシステムコールであるかを確認できます。シェルは、すべてのシステムコールを要求し、終わり近くのある時点で、次のようなメッセージが表示されます。
_....
ioctl(3, SNDCTL_TMR_START or TCSETS, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)
....
_
こちら 、使い方の例を見つけることができます。
Suggestion:ioctl(...)
システムコールの前に、同じデバイスに対してopen(...)
システムコールが必要です。デバイスのヘッダーファイルに移動し、渡すことができる別のコマンドを確認してください。問題は、認識されないコマンドである必要があります(使用されているデバイスドライバの古いバージョンによるmaybeによる)。これは単なる提案です。