まず、簡単なことをすればそのようなことは起こりません!だから私が知らないもう一つはそれを変換することです。ssh [email protected] "cat backup.tar" > backup.tar
サーバーへのアクセスを許可せずに、システムの現在の状態のバックアップを提供する必要があります。私がしたことは次のとおりです。
- 新しいユーザーを作成します。彼をそう呼ぶ
username
- SSHキーを介してのみアクセスを許可する
- 鍵を入れて
authorized-keys
- コマンド/シェルをカスタム
/etc/passwd
スクリプトに変更username
- カスタムスクリプトはデータベースダンプを実行し、いくつかのファイルをコピーしてデータを取得し、最後にtarアーカイブを生成します。
stdout
- に追加の出力がないことを確認してください
stdout
。
データを取得するには、次の手順を実行する必要があります。ssh [email protected] > backup.tar
これで、変更された行の終わりを除いて、ほとんどすべてがうまく機能します。ますますtar
大きくなるにつれて、各行には記号で終わる線量線があることがわかります^M
。バイナリtarファイルを強制的に生成すると、dos2unix
ファイルはサーバー上のファイルと一致します。
なぜこれが起こり、行末がどのように変わりますか?でも、次のように単純化しました。username
リンクのサーバー上のスクリプトは/etc/passwd
リンクを生成し、上記のコマンドでログインし、出力を自分のローカルコンピュータ上のファイルにリダイレクトすると、行末はcat .viminfo
まだエラーを送信します。ssh
username
答え1
起こり得ること:ssh
コマンド引数なしで(および指定されたオプションなしで)呼び出されると、RemoteCommand
擬似端末セッションはデフォルトでリモートシステムに割り当てられます。これは、リモートシステムを実行するように設定されたコマンドに関係なく発生します。擬似端末は通常、改行文字をキャリッジリターン+改行シーケンス(LF
→ CRLF
、参照)に変換するように構成されています。この回答詳細な説明のため)。したがって、スクリプトの出力は疑似端末装置に書き込まれ、疑似端末装置はそれを変更してクライアントに送信します。
疑似端末割り当ては、次のようなさまざまな方法で回避できます。
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 :
。
もちろん、最も適切なオプションは、ユースケース、特にユーザーの選択を許可するかどうかによって異なります。
また見なさい:
- 1 つのコマンドのみを実行する UNIX アカウントの作成- 部分的な代替案の場合、指摘したとおりコメントからあなたの質問に対するユーザーのデフォルトのインタプリタとして使用されるスクリプトは、(潜在的に)ユーザーがシェルを取得するのを防ぎますが、独自に悪用可能な要素を追加することもできます。
答え2
ssh
Pythonスクリプト用のトンネルを作成しています。 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
。テストのためにトンネルを開くだけで、タイムアウトは問題になりません。