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


13

当使用ssh命令启动ssh会话时,我似乎有两个选择-具有默认env的默认交互式会话和从主目录开始-或执行任意命令但非交互式执行(即使ssh "command; command; bash -i -l"有些技巧似乎也没有太大用)。我经常需要交互式会话,但是在此之前发生了一些事情-通常是目录更改,有时是系统环境调整。这些内容在每个会话中会有所不同,所以我不能仅仅坚持下去.bashrc

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

Answers:


13

我正在自我解答,因为我终于发现了这个秘密。的-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/ .profileget执行之前受到限制。这有好处也有缺点-仅仅覆盖从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's进入后立即进入用户帐户的方法,并且使用“ -t”选项使其有效。如果没有这个选项,你的shell没有提示,没有命令历史,从一个SIGINT等模具
Ashoat

这个答案确实很有帮助,但是您在;第一个ssh登录字符串中缺少了几秒钟。它不会让我编辑您的答案,因为我的变化不够。我得到了这个工作ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'。我认为这就是您的意图。
Rob Kwasowski19年

2

编辑.bashrc并将您的SSH特定环境设置包含在以下内容中:

if [ $SSH_TTY ]; then
    ...
fi

这将允许您添加专门用于SSH会话的设置。“当然,如果您只想在一开始设置随时间变化的任意环境变量,那么除了键入它们外,我不知道如何让机器为您猜测它们……无论如何,您都可以”需要一些可测试的条件来进行设置选择。


2

ssh手册页:

另外,ssh读取〜/ .ssh / environment,并在文件存在并且允许用户更改其环境的情况下,向环境添加格式为“ VARNAME = value”的行。有关更多信息,请参见sshd_config(5)中的PermitUserEnvironment选项。

其中说:

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

此功能可用于~/.bashrc使用Mickey建议的if结构有条件地执行远程语句。


1

只需以这种方式运行: ssh -t yourdomain 'cd /yourpath; bash'

  • -t :以便出现提示
  • ; bash:这样,尽管执行了命令(在此处cd)并从ssh会话退出,它仍将返回控件

欢迎使用ServerFault!请提供命令或脚本的说明和/或文档,以说明其用途。
Cory Knutson

1
感谢@CoryKnutson,我已按您的要求进行了更改
Sumit Ramteke,
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.