在进入交互模式之前,我可以在启动ssh会话时执行一些命令吗?

当使用ssh命令启动ssh会话时,我似乎有两个select – 默认的交互式会话与默认的env并从主目录开始 – 或执行任意命令,但非交互式(甚至技巧,如ssh "command; command; bash -i -l"似乎没有太多的好处)。 通常我想要交互式会话,但是之前发生了一些事情 – 通常是目录更改,或者有时系统环境调整。 这些东西会因会话而异,所以我不能将它们粘贴到.bashrc左右。

有什么办法可以做到这一点?

我自我回答,因为我终于发现了这个秘密。 对于ssh-t选项和-l选项都不会导致自己的loginshell,但它们的组合起作用。

ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l' ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'改变目录,设置环境variables,然后启动正确的loginshell(迄今为止我发现的唯一区别是/etc/motd不以这种方式显示 – 通常是ssh )或login的责任,而不是bash的 – 除了一切似乎完美,所有的环境variables是相同的)。

这些环境/目录更改发生在ssh之后,因此它们不受PermitUserEnvironment和相关设置(完全按照计划)的限制,但在执行.bashrc / .profile之前。 这有好处和坏处 – 只是重写从PS1等bash初始化脚本中设置的东西比较困难,但是更容易将正确的值包装到ssh命令行中,并且.profile完成所有繁重的工作。

如果真的有必要的话,实际上很容易让bash执行一些.profile之后的命令,例如ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx' ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx' ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx' – 这种方式非常丑陋,但是这些替代的.profile文件可以在之前做好准备。 (据我可以告诉bash有一些.profile脚本的候选位置,并会执行find的第一个 – . file没有这样的自动回退,所以你需要检查你的正常profile在哪里,如果你想去做)

编辑.bashrc并将您的SSH特定的环境设置放在:

 if [ $SSH_TTY ]; then ... fi 

这将允许您添加专门用于SSH会话的设置。 “当然,如果所有你想要的是设置任意的环境variables,一开始就会有所不同,但是我不知道如何让机器除了打字之外还能为你猜猜它们……不pipe你怎么看,需要一些可testing的条件来根据设置的select。

ssh手册页:

此外,如果文件存在并允许用户更改其环境,则ssh将读取〜/ .ssh / environment,并将格式“VARNAME = value”的行添加到环境中。 有关更多信息,请参见sshd_config(5)中的PermitUserEnvironment选项。

其中说:

的PermitUserEnvironment
指定〜/ .ssh / authorized_keys中的〜/ .ssh / environment和environment =选项是否由sshd(8)处理。 默认是“否”。 启用环境处理可使用户能够绕过使用诸如LD_PRELOAD之类的机制的一些configuration中的访问限制。

这个工具可以用来使用Mickeybuild议的if结构有条件地执行远程~/.bashrc中的语句。