ローカルシェルエイリアスをsshセッションに動的にロードする


24

sshを使用していくつかのマシンにログインするとき、エイリアス関数がそこにあることを望みます。つまり、コマンドショートカットを使用できるマシンにログインします。

動的である必要があります。ログインするたびにエイリアスを更新したいです。

注:多くの場合、マシンとファイルを知らずに初めてログインします。シングルログインの場合もあります。そのマシンに対して一度だけです。後でクリーンアップする必要があり、以前の構成も復元する必要があります。

回答:


18

.bashrc別の名前でリモートマシンに一時的にコピーできます。たとえば、次を使用し.bashrc_tempます。

user@local$ scp .bashrc user@remote:~/.bashrc_temp

その後、リモートマシンにログインできます。

user@local$ ssh user@remote

そしてsourceファイル.bashrc_temp

user@remote$ source ~/.bashrc_temp

これで、あなた.bashrcとあなたの関数を使用することができます。作業が終了したら、リモートマシンの〜/ .bashrc_tempファイルを削除してログアウトできます。

ファイルのコピーとリモートマシンへのログインは、bash関数を使用して実現できます。

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

更新

また、コピーすることを検討する.bashrcには/tmp、あなたのリモートマシンとソースに/tmp/.bashrc_temp

アップデート2

ssh -tを使用して、リモートマシンにログインできます。これは自動的にtempを使用します.bashrc。更新された機能s()

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

これは間違いなく私が探しているものです。ありがとう!しかし、より機能的にすることは可能ですか?ワンステップで?なぜなら、今はログイン、ソース、ログアウトの前に削除の3つのステップが必要だからです。

OK、更新後に表示されます。すばらしいです。もう一つの修正: "bashの--rcfile /tmp/.bashrc_temp; RM /tmp/.bashrc_temp"

アップデート2に修正を追加しました。ありがとう。

5
ほとんどすべての回答(これを含む)は、で予測可能なファイル名を使用しています/tmp/。これは、ログインするユーザーとして任意のコードを実行するために他のユーザーによって簡単に悪用される可能性があります。これはmktemp、一時ファイルに一意の名前があることを確認するために使用する必要があります。
トメツキー

9

jens-naはすばらしい答えを提供してくれました。私は少し時間を費やして、少しだけ良くなるように少しやり直しました。このようにして、ポート番号などのパラメーターをSSHに渡すことができます。違いは、異なるコマンドパラメーター名を使用するの代わりに、sshコマンドを使用して.bashrcファイルをアップロードすることですscp

また、別のファイルをアップロードすることにも気付くでしょう。.bashrc_remoteそのため、すべてではなく、リモートサーバーでソースするものを正確に選択できます。

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

次のように実行します。

sshs user@server

名前 ' sshs'は、「SSHソース」を表します。調達sshしたくないときに使用し、調達するときに使用sshsします。

https://gist.github.com/jonahbron/5549848


それは便利です。同じパラメータのセット。異なるポート番号を指定するためだけに〜/ .ssh / configにエントリを追加する必要はありません!
トメックワイデルカ

それは、同じコマンド名があるので、多分残念ながら1つのレポートにあなたのコマンドを結ぶ...一度だけパスワードを1回の実行でそれを行う、と入力することが可能である:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka

@TomekWyderkaええ、私は約20分間、1つのコマンドに変換しようとしましたが、方法が見つかりませんでした。おそらく私が理解するよりもBASHに精通している人かもしれませんが、それは可能ではないようです。
ジョナ

2
私はこの答えを数週間にわたって繰り返しました。結果は、問題を解消
RussellStewart

1
@Jonahは、$ @の代わりに$ {*:1}を使用した理由を説明できます。
ラッセル・スチュワート14

8

sshrcはあなたが探しているものだと思います:https : //github.com/Russell91/sshrc

sshrcはsshと同じように機能しますが、リモートでログインした後に〜/ .sshrcをソースします。

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

これを使用して、環境変数の設定、関数の定義、ログイン後のコマンドの実行ができます。それはとてもシンプルで、サーバー上の他のユーザーに影響を与えることはありません-sshrcを使用していてもです。より高度な構成については、読み続けてください。


いいね 私はxxdハックが好きです!
トメックワイデルカ14

@Tomek-はい、xxdハックは完全に素晴らしいです。私は本当にscpで仕事を成し遂げようとしました。次に、sshにパイピングします。サーバーへの2回の呼び出し-2つのパスワードエントリ-2回のラウンドトリップなしでは実行できません。それは受け入れられませんでした。だから私は考えられないことをした。
ラッセル・スチュワート14

バグがあります。sshrcが応答せずにハングします。デバッグコードを(コメントに含めることができます)sshrcに入れて、トレースできるようにしてください。
トメックワイデルカ14

面白い。これは単なるbashスクリプトであるため、通常、スローされたエラーや警告はすべて自動的に画面に出力されます。.sshrc.dには何バイトありますか?また、入力するだけでvim $(which sshrc)、bashファイルを確認できます。各行の後にechoコマンドを追加して、ハングする場所を確認できます。
ラッセルスチュワート14

5

制限についてはわかりませんが、次のようなものでこれを動作させることができました。

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"

これは単一のsshコマンドであり、scpのものではないため、私にとって最良の答えです。私にとって残っている唯一の改善点は、RC_DATA変数を回避する方法を見つけることです。
スリダールサルノバト

2

これが私が思いついたものです。通常のrcファイルを維持できますが、1つのssh接続ですべてを実行することもできます(つまり、最初にscpを実行するのではなく、1回ログインするだけで済みます)。

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

rcファイルの大きさは、どこかで最大になる可能性があるため、どれだけ大きいかわかりません。


これを正しく機能させるには、コマンドの一部を一重引用符で囲む必要がありました。echo '`base64 .... sh`'-その後、きれいに機能しました。ありがとう!!
Kロビンソン

サイズが問題になる場合は、base64エンコードの前にgzipなどの圧縮ユーティリティを介してファイルの内容をパイプすることができます。
Kロビンソン

2

https://github.com/fsquillace/pearl-sshが必要なことを行うと思います。

sshrcが生まれるずっと前に書いたので、sshrcと比べてより多くの利点があります。

  • 両方のホストのxxdへの依存関係は必要ありません(リモートホストでは利用できない場合があります)
  • Pearl-sshはより効率的なエンコードアルゴリズムを使用します
  • わずか20行のコードです(本当に簡単に理解できます!)

例えば:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit

1

単一のSSHセッションで動作させるための1つのオプションは、変数を使用してbashファイルをコピーするのではなく保存することです。

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

私のために働くようです。


1

私はあなたのような問題を解決しようとしていて、私が本当に探しているのはsshfsであることに気づきました。たぶんあなたもそれを使用できますか?

私の問題は、ssh'ingのときに、リモートで作業している間、色、エイリアス、関数、およびスクリプトを保持したいということでした。

http://fuse.sourceforge.net/sshfs.html


笑、これも私には起こりませんでした。それは非常に創造的なソリューションです。
シュリダールSarnobat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.