誤ってファイルにソースコードを埋め込み、その逆も同様です.bash_profile
。bashrc
マシン(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
ため、保存されません。sshd
sh -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
サーバーで利用可能な他のシェルを試すことができます。)csh
fish
ダウンロード - 編集 - アップロードに問題があります.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。