6

テーブルのバックアップを別のサーバーにダンプしたいのですが、sshを使用しています。以下のコマンドを実行するとエラーが発生しますが、ダンプファイルは宛先にコピーされます。

mysqldump -u username -ppassword dbname tablename | ssh -t -t servers_username@domain_name 'cat > /tmp/bckp.sql';

tcgetattr:引数が無効です

CTRL+を押すcと、エラーメッセージが追加されますKilled by signal 2.

このエラーはなぜですか?

4

2 に答える 2

11

ssh -t -tまたはを使用して疑似端末の割り当てを強制すると、このエラーが発生しますssh -tt

このtcgetattr関数は、ファイル記述子で表される疑似端末の属性を検索するために使用されます。ターミナルメタデータを格納するために、ファイル記述子とtermios構造体へのポインタが必要です。glibcのスタブコードから、このエラーは構造体のnullポインタを表しているように見えますtermios。これらの同じエラー処理セマンティクスがのプラットフォーム固有の実装に適用されているかどうかはわかりませんtcgetattr

このエラーを抑制したい場合は、次sshのように呼び出します。

ssh 2>/dev/null

これにより、STDERRが/dev/null;にリダイレクトされます。このリダイレクトで呼び出すときにエラーは表示されません。sshこれにより、他のエラーが;でマスクされることに注意してください。デバッグのためにこれを削除する必要があるかもしれません。

于 2013-01-14T16:20:20.263 に答える
4

私の場合、2 レベルの ssh 呼び出しの外側の ssh に pty の割り当てを強制すると、問題が解決しました。

詳細:

ssh が実行するコマンド (例: ssh some_server "do_some_command" ) を指定すると、ssh は対話セッションが不要であると想定し、要求された "do_some_command" ジョブをサブミットするときに pty を割り当てません。

ただし、2 層の ssh がある場合は、興味深いことになります (たとえば、最初に「ゲートウェイ」マシンに ssh し、そこから「内部」マシンに ssh して「inner_command」を実行するとします)。

問題は、2 層の ssh ジョブでは、外側の ssh の観点から、外側の ssh が非対話型コマンドを実行することを要求しているため、外側の ssh は tty を割り当てません。

内側の ssh で実行しているコマンドが対話型であることが意図されている場合、おそらく tty 属性を照会する必要があり、(当然のことながら) tty で実行されていないと不平を言うでしょう。

私の場合の解決策は、 -t 引数を使用して、外側の ssh に pty を割り当てるよう強制することでした。したがって、次のようになりました。

ssh -t <gateway_machine> "ssh <inner_machine> \"<inner_interactive_command>\" "

そこにいるシステム管理者への挨拶

于 2014-09-04T23:45:08.453 に答える