web-dev-qa-db-ja.com

SSHを試行する際のデバイスの不適切なioctl

私はいくつかのサーバーを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

5

tcgetattr: Inappropriate ioctl for devicenormallyは、一部のプログラムが端末制御操作を実行しようとしたが、その標準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ターミナルに接続されたコマンドを実行しています。これ以上手伝うことはできませんが、おそらく 同様の問題に関するこの古い回答 がいくつかの手がかりを提供します。

7
zwol

この回答では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による)。これは単なる提案です。

1
Leos313
1
Felipe