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


24

当我使用ssh登录到某些计算机时,希望我的别名功能在那里。换句话说,登录到我希望可以使用命令快捷方式的计算机。

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

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

Answers:


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个步骤:登录,源,注销之前删除。

好的,我在更新后立即看到了。大。另一个解决方案:“ bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp”

我已将您的修复程序添加到更新2中。谢谢。

5
几乎所有答案(包括此答案)在中都使用可预测的文件名/tmp/。任何其他用户都可以利用此漏洞以登录用户身份运行任何代码。这mktemp应用于确保临时文件具有唯一名称。
Tometzky

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中添加条目,只需指定不同的端口号即可!
2013年

由于它是相同的命令名称,也许可以一次运行,只输入一次密码...不幸的是,将命令合并到一份报告中:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka,2013年

@TomekWyderka是的,我尝试了大约20分钟以将其简化为一个命令,但没有找到方法。也许一个人比我更了解BASH,但似乎不可能。
约拿(

2
我接受了这个答案,并在几周内对其进行了迭代。结果是一个完善的工具解决了这个问题:github.com/Russell91/sshrc
RussellStewart

1
@Jonah可以向我解释为什么您使用$ {*:1}而不是$ @。
RussellStewart 2014年

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 hack!
Tomek Wyderka 2014年

@Tomek-是的,xxd hack真的很棒。我真的试图用scp完成这项工作。然后用管道插入ssh。如果没有两次致电服务器-2次密码输入-2次往返,就无法做到这一点。这是不可接受的。所以我做了不可思议的事情。
RussellStewart 2014年

我有一个错误。sshrc挂起而没有响应。您能否将一些调试代码(可以在注释中)放入sshrc中,以便我进行跟踪。
Tomek Wyderka 2014年

有趣。这只是一个bash脚本,因此通常抛出的任何错误或警告都会自动打印到屏幕上。.sshrc.d中有多少个字节?另外,只需键入vim $(which sshrc)即可看到bash文件。您可以在每行之后添加echo命令,以查看其挂起位置。
RussellStewart 2014年

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变量的方法。
Sridhar Sarnobat '17

2

这就是我想出的。它允许您维护一个普通的rc文件,但也可以在一个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文件可以有多大,因为它有时可能会最大。


我必须将命令的一部分用单引号引起来才能正常工作。echo'`base64 .... sh`'-之后,它的工作非常漂亮。谢谢!!
罗宾逊K,2015年

如果大小成为问题,则可以在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会话一起使用的一种选择是使用变量存储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


大声笑,这对我也从未发生过。这是一个非常有创意的解决方案。
Sridhar Sarnobat '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.