EC2サーバーにSSHで接続するときに無限のbashループ(bashrc + bash_profile)を変更する方法は?

EC2サーバーにSSHで接続するときに無限のbashループ(bashrc + bash_profile)を変更する方法は?

誤ってファイルにソースコードを埋め込み、その逆も同様です.bash_profilebashrcマシン(ec2)でsshを試みると、bashのロードが中断され、1秒以内に接続が閉じられます。修正する方法はありますか? bashファイルを変更するためにディスクを別のec2インスタンスにマウントできますか?


アップデート1:以下を試しました。

%  ssh -i "my-pem.pem" -t ubuntu@<server_address>.amazonaws.com "/bin/bash --noprofile --norc"
Connection to <server_address>.amazonaws.com closed.

他は現れません。何が問題なのかご存知ですか?

完全な確認のためにこれを行うと、ssh -i "my-pem.pem"ubuntu@<server_address>.amazonaws.comメッセージは次のようになります。

...

28 packages can be updated.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable

New release '20.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Mon Feb 22 23:17:41 2021 from ip
Connection to <server_address>.amazonaws.com closed.

解決策

マシンにSSH経由で接続し、Ctrlcすぐにbashファイルを修正してください。

答え1

【書き直す】

この興味深いケースは、より良い回答を得る資格があります。スーパーユーザーへの答えです。)。

ssh user@server command以下の元の答えは、コマンドが非対話型シェルで実行されてエラーが.bashrc実行されるのを防ぐという事実に依存していました。

問題はリモートシェルにあります。 Bashの場合、次のrcファイルを実行できる特別な関数があります。

rshd(man bash)Bashは、リモートシェルデーモン(通常)またはセキュアシェルデーモンによって実行されるときなど、ネットワーク接続に接続されている標準入力を使用して実行されていることを確認しようとしますsshd。 bashがこのように実行されていると判断した場合~/.bashrc(ファイルが存在して読み取れる場合)、コマンドを読み込んで実行します。 shで呼び出すと、これは行われません。この --norcオプションを使用すると、この動作を抑制でき、他のファイル --rcfileを強制的に読み取るためにこのオプションを使用できますが、通常、シェルはこれらのオプションでrshd呼び出さsshdれるか、指定は許可されません。

つまり、リモートシェルがBashの場合、実行してもssh user@server 'rm .bashrc'コマンドが.bashrc最初に実行され、無限ループのためにrmコマンドは実行されません。

コマンドを呼び出して内部的に実行されるscpため、保存されません。sshdsh -c scp ...

唯一の例外はSFTPです。sshd組み込みSFTPサーバー。sshd外部サーバーの代わりにこの内部SFTPサーバーを使用するように構成されている場合、サーバーは起動しませんbash -c ...

scpしたがって、リモートベースシェルがBashの場合、唯一のオプションはsftp


[元の回答]

インストールに応じて、次のいくつかのオプションがあります。

ファイルを編集します.bashrc

ssh -t user@server 'vi ~/.bashrc'

bashファイルなしで実行.bashrc

ssh -t user@server '/bin/bash --noprofile --norc'

別のシェルを実行します。

ssh -t user@server /bin/sh

(は例です。またはなど、shサーバーで利用可能な他のシェルを試すことができます。)cshfish

ダウンロード - 編集 - アップロードに問題があります.bashrc

$ scp user@server:~/.bashrc /tmp/bashrc
$ vi /tmp/bashrc
$ scp /tmp/bashrc user@server:~/.bashrc

答え2

を実行すると、デフォルトではssh対話モードでシェルが実行され、対話モードで処理されます.bashrc。ただし、実行するコマンドを指定すると、非対話型モードでシェルが呼び出されます(したがって、それは処理されません.bashrc)。 。

これを使用して対話型シェルを起動できますが、シェルにコマンドライン引数を指定して、次の処理を行わないように指示できます.bashrc

$ ssh -t user@host "/bin/bash --noprofile --norc"
bash-5.0$

ファイルに問題がある場合は、ログインに.bashrc役立ちます。ただし、問題がbash関連profileファイル(たとえば.bash_profile)にある場合、最初の非対話型シェルでまだ中断される可能性があります。

答え3

~/.bashrc通常、インタラクティブシェルとログインシェル(~/.bash_profileログインシェルと非ログインシェルの違いは何ですか?)。 Sshを介してコマンドを送信するだけで対話型シェルまたはログインシェルが提供されないため、ファイルの1つの名前を変更するだけです(例:)ssh user@host 'mv .bashrc .bashrc.bak'

しかし、Xhienneが指摘したように、1つの例外があります。SSHデーモンによって呼び出されると、BashはBashrcを取得します。

しかし、Xhienneと私はこれを再現できませんでした。。私のテストは、touch testfileサーバーのBashrcに接続してダミーコマンドを試して、何が起こったかを確認することでしたssh Quasímodo@server 'echo x'。結果:何もtestfile生成されませんでした。後で私のBashrcの最初の行に次の内容が含まれていることがわかりました。

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

つまり、シェルが対話型でない場合は、Bashrcの読み取りを停止します。このきちんとしたトリックは、実際にはほとんどのディストリビューションに次のように存在します。 bashrcが現在のシェルが対話型であることを確認するのはなぜですか?

結論として

Andy、Xhienne、そして私の元の答え(SSHを介してコマンドを実行するのと同じ)は

  • ユーザーのリモートBashrcにフラグメントがあると成功します。
  • それ以外の場合は失敗します。この場合、以下にいくつかのオプションがあります。サーバー障害、ここでCtrl-C。

関連情報