当使用 ssh 命令启动 ssh 会话时,我似乎有两个选项 - 使用默认环境的默认交互式会话并从主目录启动 - 或者以非交互式方式执行任意命令(即使像 这样的技巧ssh "command; command; bash -i -l"
似乎也没什么用)。我经常想要交互式会话,但在此之前会发生一些事情 - 通常是目录更改,或者有时是系统环境调整。这些事情会因会话而异,所以我不能把它们粘在一起.bashrc
。
有什么办法可以实现这一点吗?
答案1
我自己回答,因为我终于发现了这个秘密。-t
选项ssh
和-l
选项都bash
不能单独导致登录 shell - 但组合起来却可以。
ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'
更改目录,设置环境变量,然后启动正确的登录 shell(到目前为止我发现的唯一区别是/etc/motd
不以这种方式显示 - 它通常 ssh
是 或login
的责任,而不是 的bash
责任 - 除此之外一切似乎都运行正常,并且所有环境变量都是相同的)。
这些环境 / 目录更改发生在 ssh 之后,因此它们不受PermitUserEnvironment
和相关设置的限制(完全按照计划),但在.bashrc
/.profile
执行之前。这有优点也有缺点 - 很难覆盖从 bash init 脚本(如)设置的内容PS1
,但更容易将正确的值打包到ssh
命令行中,并完成.profile
所有繁重的工作。
如果真的有必要,其实很容易让 bash 在之后的.profile
命令行中执行一些操作——这样说起来很难看,但是这些备用文件可以提前准备好。(据我所知,有几个脚本的候选位置,会执行找到的第一个脚本——没有这样的自动回退,所以如果你想这样做,你需要检查你的正常位置在哪里)ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'
.profile
bash
.profile
. file
profile
答案2
编辑 .bashrc 并将您的 SSH 特定环境设置包含在以下内容中:
if [ $SSH_TTY ]; then
...
fi
这将允许您添加专门针对 SSH 会话的设置。当然,如果您想要的只是在开始时设置随会话而变化的任意环境变量,我不知道除了输入它们之外,您还能如何让机器为您猜测它们……无论如何,您都需要一些可测试的条件作为设置选择的基础。
答案3
从ssh
手册页中:
此外,如果文件存在且允许用户更改其环境,ssh 会读取 ~/.ssh/environment,并向环境中添加格式为“VARNAME=value”的行。有关更多信息,请参阅 sshd_config(5) 中的 PermitUserEnvironment 选项。
其中写道:
PermitUserEnvironment
指定 ~/.ssh/environment 和 ~/.ssh/authorized_keys 中的 environment= 选项是否由 sshd(8) 处理。默认值为“no”。启用环境处理可能使用户能够使用 LD_PRELOAD 等机制绕过某些配置中的访问限制。
~/.bashrc
此功能可用于使用if
以下结构有条件地执行远程中的语句:米奇建议。
答案4
只需按以下方式运行:ssh -t yourdomain 'cd /yourpath; bash'
-t
: 这样提示就会出现; bash
cd
:这样,尽管执行了命令(此处)并退出 ssh 会话,它仍会返回控制权