动态加载本地 shell 别名到 ssh 会话

Tom*_*rka 27 linux ssh bash shell login

当我使用ssh登录到某台机器时,我希望我的别名函数在那里。换句话说,登录到一台我希望可以使用我的命令快捷方式的机器。

我需要它是动态的,每次登录时我都希望我更新了别名。

注意:很多时候是第一次登录,不知道那里的机器和文件。有时它是单次登录。那台机器只有一次。之后需要清理,之前的配置也必须恢复。

小智 19

您可以临时将您的.bashrc名称复制到您的远程机器上。例如,使用.bashrc_temp

user@local$ scp .bashrc user@remote:~/.bashrc_temp
Run Code Online (Sandbox Code Playgroud)

之后,您可以登录远程机器:

user@local$ ssh user@remote
Run Code Online (Sandbox Code Playgroud)

source文件.bashrc_temp

user@remote$ source ~/.bashrc_temp
Run Code Online (Sandbox Code Playgroud)

现在您可以使用您.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
}
Run Code Online (Sandbox Code Playgroud)

更新

您还可以考虑将 复制.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"
}
Run Code Online (Sandbox Code Playgroud)

  • 几乎所有的答案(包括这个)都在 `/tmp/` 中使用可预测的文件名。这很容易被任何其他用户利用以作为登录用户运行任何代码。这应该使用 `mktemp` 来确保临时文件具有唯一的名称。 (5认同)

Jon*_*nah 11

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"
}
Run Code Online (Sandbox Code Playgroud)

运行如下:

sshs user@server
Run Code Online (Sandbox Code Playgroud)

名称“ sshs”代表“SSH 源”。使用ssh时,你不想来源和用途sshs当你这样做。

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

  • 我已经接受了这个答案并在几周内对其进行了迭代。结果是一个完整的工具可以解决问题:https://github.com/Russell91/sshrc (2认同)

Rus*_*art 10

我认为 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 ..'
Run Code Online (Sandbox Code Playgroud)

您可以使用它来设置环境变量、定义函数和运行登录后命令。就这么简单,它不会影响服务器上的其他用户——即使他们也使用 sshrc。有关更高级的配置,请继续阅读。


小智 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"
Run Code Online (Sandbox Code Playgroud)