su
リモートサーバー(Amazon Linux 2)にSSHを介して同時にいくつかのコマンドを実行し、次の単一スクリプトでSSHセッションを維持したいと思います。
ssh -t ec2-user@$host -i $keypath \
'sudo -iu some-user bash -c "
echo a;
c(){ clear; };
echo b;
"'
出力:
a
b
Connection to xx.xx.xx.xx closed.
だから少しずつ改善するにつれて
ssh -t ec2-user@$host -i $keypath \
'sudo -iu some-user bash -c "
echo a;
c(){ clear; };
echo b;
bash -l;
echo c;
"'
出力:
a
b
(その後、SSH経由でsome-userユーザーとしてリモートにログインし、セッションを維持することに成功しました。)
しかし、
# on the remote
$ whoami
some-user
$ c
bash: c: command not found
c
SSH経由のユーザー:some-userとしてログインした後、コマンドが機能したいと思います。
この問題をどのように解決できますか?
注:
1.
bash -l
SSHセッションをアクティブにしてください。削除するとSSHにログアウトします。
2.
他の人のSSHセッションではなく、私のSSHセッションにのみ影響を与えたいので、~/.bashrcのような初期化ファイルを編集したくありません。
3. SSH ログイン後
はできますalias c=clear
。しかし、10個の(機能的)エイリアスを設定し、10個の異なるリモコンがあると面倒です。
4.
リモートシェルは /bin/bash です。
ベストアンサー1
あなたの例では、エイリアシングが機能しているか機能していないことを示していません。実際に動作するかもしれませんが、不明であり、とにかくそこには役に立ちません。
Aliasは、現在のシェルのシェルエイリアスを設定するために使用されるシェル組み込みコマンドです。シェルのメモリを除くどこにもエイリアスを保存しません。
新しいシェルを起動すると、他のシェルインスタンスのエイリアスは覚えていません。シェル全体でエイリアスを記憶するには、そのエイリアスがシェル初期化ファイルの1つになければなりません。
仮に、このようなコマンドは非対話型で実行され、多くのシェル初期化ファイルは非対話型シェルのエイリアスをロードするように構成されていません。また、シェルがロードする初期化ファイルは、これがログインシェルかサブシェルか、一時非反復シェルかによって異なります。さらに、シェルオプションはinitファイルのロードを明示的に無効にすることができます。したがって、非対話型シェルでエイリアスを使用できるようにするには、エイリアスを生成するシェル初期化ファイルに注意する必要があります。
この組み合わせにsudoを追加すると、状況がさらに混乱します。ルートシェルでこのエイリアスを使用しますか?その後、ルートのシェル初期化ファイルに配置する必要があります。
bashのLinuxベースシェルが対話型シェルであると仮定すると、~/.bashrc
エイリアスを使用したいすべてのユーザー(ルートを含む)はエイリアスを使用できます。