Answers:
我正在自我解答,因为我终于发现了这个秘密。的-t
选项ssh
或-l
选项bash
都不会导致登录外壳本身-但两者结合起作用。
ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'
更改目录,设置环境变量,然后启动正确的登录外壳程序(到目前为止,我发现的唯一区别/etc/motd
是未以这种方式显示-通常是 ssh
“或login
”的责任,而不是bash
“-”)完美地工作,并且所有环境变量都相同)。
这些环境/目录更改在ssh之后发生,因此它们不受PermitUserEnvironment
相关设置(严格按计划)的限制,而是在.bashrc
/ .profile
get执行之前受到限制。这有好处也有缺点-仅仅覆盖从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
如果要执行此操作,则需要检查正常位置)
;
第一个ssh登录字符串中缺少了几秒钟。它不会让我编辑您的答案,因为我的变化不够。我得到了这个工作ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'
。我认为这就是您的意图。
编辑.bashrc并将您的SSH特定环境设置包含在以下内容中:
if [ $SSH_TTY ]; then
...
fi
这将允许您添加专门用于SSH会话的设置。“当然,如果您只想在一开始设置随时间变化的任意环境变量,那么除了键入它们外,我不知道如何让机器为您猜测它们……无论如何,您都可以”需要一些可测试的条件来进行设置选择。
从ssh
手册页:
另外,ssh读取〜/ .ssh / environment,并在文件存在并且允许用户更改其环境的情况下,向环境添加格式为“ VARNAME = value”的行。有关更多信息,请参见sshd_config(5)中的PermitUserEnvironment选项。
其中说:
PermitUserEnvironment
指定〜/ .ssh / authorized_keys中的〜/ .ssh / environment和environment =选项是否由sshd(8)处理。默认为“否”。启用环境处理可以使用户使用LD_PRELOAD之类的机制绕过某些配置中的访问限制。
此功能可用于~/.bashrc
使用Mickey建议的if
结构有条件地执行远程语句。
只需以这种方式运行: ssh -t yourdomain 'cd /yourpath; bash'
-t
:以便出现提示; bash
:这样,尽管执行了命令(在此处cd
)并从ssh会话退出,它仍将返回控件