如何在SSH登录时使用自定义.bashrc文件


21

我发现与我合作的新公司经常需要访问寿命相对较短的linux服务器。在每台服务器上我都有一个帐户,但是无论何时创建一个新帐户,我都必须经历转移.bashrc的麻烦。但是有可能在大约一个月的时间内,该服务器将不再存在。我还必须在短时间内(数分钟)访问许多其他服务器,但这并不值得通过我的.bashrc进行传输,但是由于我正在使用许多服务器,因此这会浪费大量时间。

我不想更改服务器上的任何内容,但是我想知道是否有一种方法可以使用“每连接” .bashrc,因此无论何时我将SSH连接到服务器,我的设置都将用于该会话。

如果可以的话,如果我可以对其他配置文件(例如gitconfig文件)做同样的事情,那就太好了。


这不是每个连接的解决方案,但您可能仍会发现它很有价值。退房基地在GitHub上。有关超级用户社区的答案的更多详细信息。
codeforester

Answers:


6

我认为您想要的是(在您连接的计算机上的.ssh / config中):

PermitLocalCommand yes
LocalCommand scp yourname@someserver:/dir/dotbash /local/home/dir/.bashrc

那么您可以得出:

source .bashrc

并按照自己的喜好行事。LocalCommand到达您要连接的服务器时,将在您实际会话之前执行该命令。

我还要确保服务器上的sshds配置有 PermitLocalCommand yes

您可以通过多种方法来调整LocalCommand使其在特定环境中工作-例如,您可以从内部Web服务器卷曲,也可以从nfs挂载中拉出。


几个注意事项。首先,我想您已在scp命令中切换了文件的顺序,因为我想将bash传输到服务器,并且我想您已将它反转了。其次,您可以; source /path/to/.bashrc在scp命令之后添加以自动获取它。最后,此方法的一个不太重要的缺点是,我必须输入两次密码。但最后还是成功了,所以谢谢。
gsingh2011 2012年

对于那个很抱歉!烦死了,很抱歉混淆。您是否可以在您的环境中设置无密码的密钥设置?我们在环境中拥有它,这是一件美丽的事情。很高兴,但是有效!
Quinn Murphy 2012年

@ gsingh2011:该操作source /path/to/.bashrc将在您连接的计算机上执行。中的命令LocalCommand无权访问ssh会话。
奥利弗(Oliver)2012年

@Oliver你是对的。我已经决定从远程计算机自动执行.bashrc的采购。首次登录时,我必须在服务器端进行一些更改,但是它比以前要做的要方便得多。
gsingh2011 2012年

16

我认为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。有关更高级的配置,请继续阅读。


请停止仅发布链接的垃圾邮件。您完全可以添加评论(无论如何,这些都是与sshrc相关的帖子)。
Deer Hunter

3
我正在努力解决所有问题!
RussellStewart 2014年

做完了 第一次,我很想做一篇简短的仅链接文章。现在我知道了。
RussellStewart 2014年

1
我很久以前(在sshrc之前)写了一个类似sshrc的代码:github.com/fsquillace/pearl-ssh效率更高,更小并且没有xxd依赖性。
user967489

1

如果您以前从未访问过服务器,则〜/ .ssh / known_hosts中将没有任何条目。

您可以使用“ ssh-keygen -F”搜索给定的已知主机,但是您必须测试该输出(grep),因为ssh-keygen不会因未命中而返回false。请注意,如果您通过不同的标识符(IP地址,主机名,FQDN)来引用主机,则这些标识符将被视为单独的实例。

您可以为ssh编写包装器,以便在首次登录时将用户环境转移到该主机:

ssh-newenv(){如果!ssh-keygen -F $ 1 | grep -q“ ^#找到主机$ 1:”; 然后rsync〜/ .bashrc〜/ .bash_profile〜/ .bash_logout $ 1:。; fi; ssh $ 1; }

如果要使其更健壮,可以检查远程主机上是否存在已知的环境文件,哈希或其他标记。


0

我不知道是否每个会话.bashrc。

另一个解决方案是编写一个小的脚本,将所有您喜欢的配置转移到新的主文件夹中。

也许只是用所有带有路径的配置制作文件夹,然后使用scp传输它们

喜欢

/home/foobar/configs/.bashrc
/home/foobar/configs/.foo/bar.conf
...

然后一个

scp -r /home/foobar/configs/* foo@example.com:/home/foo/

这样可以节省时间。


0

考虑到ssh与您的无关,我认为这是不可能的.bashrc。是外壳程序加载该文件,而不是ssh。

一些想法:

  1. 首次登录时,设置远程主目录。
  2. 使用NFS在每台服务器上装载包含.bashrc的主目录。这样,您到处都有相同的设置。
  3. 如果可以将某些环境变量传输到远程服务器,则应该检查该SendEnv选项(ssh_config有关更多信息,请参见手册页)。如果服务器设置正确(即AcceptEnvsshd_config中有足够的服务器),则可以SendEnv用来将环境变量复制到远程主机上。
  4. 我不知道这是否可行,但是也许您可以在连接到远程主机之前误用该ProxyCommand设置(请参见ssh_config手册页)来发送您的.bashrc文件或其他文件。不过,这需要进行一些测试。另外,请准备好这可能会干扰scp。

0

我认为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
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.