問題とその解決方法

問題とその解決方法

奇妙な SCP の問題が発生しています:

$ scp [email protected]:~/test.txt ./
Password:
\033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H

パスワードは問題なく取得されますが、奇妙な \033H が表示されます。また、ファイルは転送されません。誰かアイデアはありますか?

答え1

これを修正するのは簡単です。通常は、 を調べて.bashrc、問題の原因となっている行または上部近くの数行を見つけ、それらを移動または削除します。難しいのは、この問題が実際に存在することを人々に納得させることです。詳細は後述しますが、修理この問題を解決するには、この短い最初のセクションのみを使用する必要があります。

問題とその解決方法

これは、.bashrcリモートマシン上のユーザーのホームディレクトリに出力を生成するコマンドが含まれている場合に発生します。非対話型シェルでも実行可能あまり一般的ではありませんが、システム全体にそのようなコマンドが含まれている場合にも発生します/etc/bash.bashrc。具体的な出力は、何がそれを生成しているかによって異なります。しかし、予期しない出力を受け取ることとない移転が成功したり、開始されたりすることとてもscpその原因を強く示唆しています(特にサーバーがDebianまたはUbuntuシステムの場合)。標準入力と出力データの送受信を行うもので、関連のないデータが送信されるとファイルを転送できません。

もしあなたが考えているなら、「それは不可能です。.bashrc対話型シェルにのみ適用されます。」あるいは、なぜこのようなことが起こるのかの詳細な説明に興味がある場合は、以下の 2 番目のセクションを参照してください。

この問題は、通常の SSH 接続を中断するものではありません。したがって、システムがssh対話型ログイン シェルに正常にログインできるように構成されていると仮定すると、それを実行し、.bashrcリモート ユーザーのホーム ディレクトリで開いて、問題のあるコマンドが不要な場合は削除するか、( を使用して) コメント アウトする#ことができます。または、必要な場合は、シェルが非対話型の場合に中止する別のコマンドの下にそれらを移動します。このようなコマンドがすでに存在している可能性があります。Ubuntu や他のディストリビューションでは、ユーザーの.bashrcファイルとシステム全体は/etc/bash.bashrc通常、このようなチェックから始まります。

.bashrcUbuntuのデフォルトファイルは、/etc/skelユーザーアカウントの作成時にコピーされ、実行中のシェルが対話型かどうかをチェックし、対話型でない場合はファイル内のそれ以上のコマンドが実行されないようにするコードが含まれています。ない:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

一部のユーザーがファイルで使用し、現在すべてのユーザーの.bashrcシステム全体のファイルで使用されているもう 1 つの一般的な方法は次のとおりです。/etc/bash.bashrc

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

ファイルがデフォルトから置き換えられたり変更されたりした場合は、どちらのファイルでもいずれかの手法が使用されている可能性があります。対話型操作を確認する方法は他にもありますが、一般的ではありません。ユーザーが独自の.bashrcファイルを最初から作成した場合、または Debian、Ubuntu、または別の Debian 派生ではない別のオペレーティング システムからファイルを移行した場合、そのようなコードはまったく存在しない可能性があります。ただし、必要な場合は追加できます。

.bashrc出力を生成し、またはに現れるコマンド/etc/bash.bashrc。ただし、上記のようなコードを使用すると、セッションの開始時に予期しないデータが送信されscpscpファイルを転送できなくなります。

最近、これらのファイルの 1 つを自分で編集し、先頭にコマンドを追加した場合は、問題の原因となった特定の変更を簡単に把握できるはずです。そうでない場合でも、上記の説明で十分な情報が得られる可能性があります。

ただし、上記の説明に基づいて問題を解決できるかどうかにかかわらず、ファイルの内容を含む詳細をすべて含めて質問を編集することをお勧めします。これらはクライアントマシン上のファイルではなく、リモートサーバー上のファイルです。そうすれば、あなたの質問を見つけた他の人が問題を理解しやすくなるだけでなく、必要に応じてより具体的なアドバイスを提供できるようになります。

問題がまったく別の原因で発生している可能性は非常に低いと思いますが、いずれにしても、追加された情報によって確実に知ることができるはずです。他の人同様の問題を抱え、解決に助けが必要なこの質問の著者よりも、もちろんないこの質問を編集しますが、独自の質問を投稿する必要があります。


問題が発生する理由

よく、これは.bashrc対話型シェルにのみ適用されると言われますが、これは誤解であり、せいぜい極度に単純化しすぎた表現です。 bashコマンドは、次の場合に実行され~/.bashrcます/etc/bash.basrhc:

  1. シェルはインタラクティブであり、または
  2. /etc/profileまたはのような別の起動スクリプト~/.profile ソースだけでなく、
  3. bash対話型シェルとしてもログインシェルとしても実行されていないが、初期シェルとして実行されている可能性が高いと判断された場合リモート接続で

bashリモートシェルであることの十分な証拠として扱われ、したがって、実際にSSHでこの効果が発生するかどうかは、主にコンパイル方法(オペレーティングシステムによって異なる)bash、およびのバージョンに基づいてバージョンsshd使用されているものです。

現在のDebianおよびUbuntuシステムでは、bash非対話型非ログインシェルとして実行されると、SSH_CLIENT環境変数が設定されていて空でないかどうかがチェックされます。(他のこともチェックしますが、現在のUbuntuシステムのSSHでは何も明らかにされません。)設定されていて、SHLVL環境変数が2未満の値に設定されている場合、それはセッションのイニシャルshell-- は、およびbashのコマンドを実行します。/etc/bash.bashrc~/.bashrc

設定ファイルを変更せずにこれを素早く確認するには、読者はbash -c ''これらの変数を手動での環境に渡し、読み取った内容をトレースします。、またはrun_startup_files関数を調べるshell.c(そのバージョンでは 1022 行目から始まります)。

非対話型非ログインシェルは、必要な権限を設定して実行することで、bashスクリプトを実行したときに取得されます。bash適切なハッシュバンラインまたは明示的に実行することでも実行できます。また、次のようなオプション付きのワンライナーを実行した場合にも、同じ結果が得られます。bash your-scriptbash-c

bash -c 'echo hello world'

予想通り、あなたが手に入れたシェルはログインSSH経由でインタラクティブセッションは対話型のログイン シェルです。次のようなコマンドを実行すると、次のようになります (成功した場合)。

ssh [email protected]

しかし、ここで直感的でない部分が登場します。ログインSSH経由で非インタラクティブセッションは非対話型です非ログインシェル。SSH 経由で単一のコマンドを実行すると、次のようになります。

ssh [email protected] command args...

つまり、SSH 経由で単一のコマンドを実行すると、bashを使用してローカルで (または既に確立されているリモート セッション内で) 単一のコマンドを実行する場合と同じ種類のシェル (非対話型、非ログイン シェル) として実行されますbash -c

ssh一般的な場合と同様に、scpはリモート マシン上でリモート ユーザーとしてシェルを実行します。これは、ユーザーがシェルとして設定した内容、つまり のユーザー エントリ/etc/passwdまたは の出力(ログイン時に環境変数getent passwdの値としても設定されます) にリストされているシェルです。 を実行して変更していない限り、これがデフォルトのユーザー シェルであり、Ubuntu では です。$SHELLchshbash

そのため、次のようなコマンドはこれbashリモート サーバー上で非対話型の非ログイン シェルも実行します。

scp [email protected]:~/test.txt ./

シェルが非対話型の場合に停止するようにコードで保護されていない限り、.bashrcまたはのコマンド/etc/bash.bashrcはそのようなシェルによって実行されます。意図的または意図せずに出力を生成する場合、scpファイルをコピーできません

関連情報