web-dev-qa-db-ja.com

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

sshを使用して一部のマシンにログインすると、-aliasesfunctionsが存在することを望みます。つまり、コマンドショートカットを使用できるようにしたいマシンにログインします。

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

注:マシンやファイルがそこにない状態で、初めてログインすることがよくあります。シングルログインの場合もあります。そのマシンでは1回だけです。後でクリーニングする必要があります。以前の構成も復元する必要があります。

24
Tomek Wyderka

_.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"
}
_
18
jens-na

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を使用していても。より高度な設定については、読み続けてください。

9
RussellStewart

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

また、別のファイル.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

9
Jonah

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

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"
5
Brad

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

私はsshrcが生まれるずっと前に書いており、sshrcに比べて多くの利点があります:

  • 両方のホストのxxdに依存する必要はありません(リモートホストでは使用できない場合があります)。
  • Pearl-sshはより効率的なエンコーディングアルゴリズムを使用します
  • わずか20行のコードです(非常に理解しやすいです)。

例えば:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl [email protected]
myserver.com $> q
exit
2
user967489

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

#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ファイルがどれくらいの大きさになるかはわかりません。ある時点で最大になる可能性があるからです。

2
mlathe

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

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

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

1
gibsop1

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

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

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

1
Deifyed