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

taw*_*taw 16 ssh

当使用 ssh 命令启动 ssh 会话时,我似乎有两个选项 - 使用默认 env 的默认交互式会话并从主目录开始 - 或者以非交互式方式执行任意命令(即使像ssh "command; command; bash -i -l"这样的技巧似乎也没有多大用处)。我经常想要交互式会话,但在此之前会发生一些事情 - 通常是目录更改,或者有时是系统环境调整。这些事情会因会议而异,所以我不能只是坚持下去.bashrc

有没有办法做到这一点?

taw*_*taw 15

我是自我回答,因为我终于发现了这个秘密。无论-t选项ssh,也不-l选项bash将导致登录shell自己-但在他们的工作相结合。

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'更改目录,设置环境变量,然后启动正确的登录 shell(到目前为止我发现的唯一区别/etc/motd是没有以这种方式显示 - 通常是 ssh's or login's 的责任,而不是bash's - 除了一切似乎以完美运行,并且所有环境变量都相同)。

这些环境/目录更改发生在 ssh 之后,因此它们不受PermitUserEnvironment相关设置(完全按计划)的限制,而是在.bashrc/.profile执行之前。这有好处也有坏处——仅仅覆盖从 bash init 脚本中设置的东西更难PS1,但更容易将正确的值打包到ssh命令行中,并.profile完成所有繁重的工作。

如果真的有必要,实际上很容易让 bash 在.profile使用命令行之后执行某些操作,例如ssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- 以这种方式放置时非常难看,但是.profile可以在之前准备好这些替代文件。(据我所知,bash有一些.profile脚本的候选位置,并将执行找到的第一个位置 -. file没有这样的自动回退,所以profile如果你想这样做,你需要检查你的正常位置)