SSH出力をファイルチェンジラインの末尾にリダイレクトする

SSH出力をファイルチェンジラインの末尾にリダイレクトする

まず、簡単なことをすればそのようなことは起こりません!だから私が知らないもう一つはそれを変換することです。ssh [email protected] "cat backup.tar" > backup.tar

サーバーへのアクセスを許可せずに、システムの現在の状態のバックアップを提供する必要があります。私がしたことは次のとおりです。

  1. 新しいユーザーを作成します。彼をそう呼ぶusername
  2. SSHキーを介してのみアクセスを許可する
  3. 鍵を入れてauthorized-keys
  4. コマンド/シェルをカスタム/etc/passwdスクリプトに変更username
  5. カスタムスクリプトはデータベースダンプを実行し、いくつかのファイルをコピーしてデータを取得し、最後にtarアーカイブを生成します。stdout
  6. に追加の出力がないことを確認してくださいstdout

データを取得するには、次の手順を実行する必要があります。ssh [email protected] > backup.tar

これで、変更された行の終わりを除いて、ほとんどすべてがうまく機能します。ますますtar大きくなるにつれて、各行には記号で終わる線量線があることがわかります^M。バイナリtarファイルを強制的に生成すると、dos2unixファイルはサーバー上のファイルと一致します。

なぜこれが起こり、行末がどのように変わりますか?でも、次のように単純化しました。usernameリンクのサーバー上のスクリプトは/etc/passwdリンクを生成し、上記のコマンドでログインし、出力を自分のローカルコンピュータ上のファイルにリダイレクトすると、行末はcat .viminfoまだエラーを送信します。sshusername

答え1

起こり得ること:sshコマンド引数なしで(および指定されたオプションなしで)呼び出されると、RemoteCommand擬似端末セッションはデフォルトでリモートシステムに割り当てられます。これは、リモートシステムを実行するように設定されたコマンドに関係なく発生します。擬似端末は通常、改行文字をキャリッジリターン+改行シーケンス(LFCRLF、参照)に変換するように構成されています。この回答詳細な説明のため)。したがって、スクリプトの出力は疑似端末装置に書き込まれ、疑似端末装置はそれを変更してクライアントに送信します。

疑似端末割り当ては、次のようなさまざまな方法で回避できます。

  • ssh-Tクライアントのオプションを使用して呼び出されます(またはの設定ファイル(おそらく)RequestTTY noで使用されます)。ssh~/.ssh/config

  • リモートシステムでユーザーが入力した内容の前に追加no-pty(スペースに注意)してください。authorized_keys

  • PermitTTY noリモートシステムのSSHサーバー構成に使用されます(特定のユーザーにのみ影響を与えるために条件付きブロックを/etc/ssh/sshd_config使用することもできます)。Match

    Match User="username"
      ForceCommand /path/to/your/script
      DisableForwarding yes
      PermitTTY no
    

    (ユーザーに対して機能するコマンドシェルが設定されているとします/etc/passwd。これにより、ユーザーのパスワードをロックして他の方法でログインできないようにすることができます。)

  • (あなたの場合は、sshコマンド引数を使用して呼び出すことも機能するはずです(例:)ssh user@host :

もちろん、最も適切なオプションは、ユースケース、特にユーザーの選択を許可するかどうかによって異なります。

また見なさい:

答え2

sshPythonスクリプト用のトンネルを作成しています。 sshコマンドラインは何もしません。引数もないので、シェルと擬似ttyを開こうとします。

sshで始まった後subprocess.Popen、私の改行文字Pythonスクリプトは改行だけに分割され、キャリッジリターンはないため、Pythonスクリプトの出力はひどいものになります。さらに、pytest擬似ttyに関して理解できない理由から、Pythonスクリプトは実行されません。 sshに供給pytestして実行できますが、-tt通常のPython stdoutはまだ破損しています。-T該当しませんpytest

sshコマンドラインに非常に長いsleepコマンドを入力して問題を解決しましたssh -L 1234:remote:1234 user@remote sleep 1000000。テストのためにトンネルを開くだけで、タイムアウトは問題になりません。

関連情報