ssh 登录后出现提示后获取文件

ssh 登录后出现提示后获取文件

单行问题:通过堡垒主机通过 SSH 登录后,如何自动在远程主机上获取远程文件?

在 ssh 进入远程主机后,我需要在远程主机上获取一个包含别名列表 + shell 用户定义函数的文件。

该文件存在于远程机器上的 /tmp 文件夹中,例如 /tmp/my-rc

搜索我发现的其他帖子和互联网

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

问题是我确实得到了一个终端,但没有设置任何别名,因为它是一个新的 bash shell'

认为源应该在附加外壳后完成,尝试了下面的方法,但这也不起作用。没有错误,我得到了终端,但认为文件没有来源(通过从 /tmp/my-rc 文件回显虚拟消息来验证)

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

甚至尝试使用“.”而不是来源,没有运气。

任何帮助。

注 1:Bash 或 ZSH 任何 shell 解决方案都可以。

注2:实际的 ssh 是通过代理命令,即跳过堡垒主机(仅提及它是否相关)

注3:我没有配置文件 rc 或 bashrc 的权限,甚至没有远程主机上的主目录的权限。

注意4:我用来登录安全主机的确切命令是通过堡垒主机,如下所示

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

答案1

使用bash,您可以执行以下操作:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

这将导致/tmp/my-rc在提示之前获取源,并且只有该提示,因为我们PROMPT_COMMAND之后取消了设置。

您需要删除unset PROMPT_COMMANDif/tmp/my-rc实际上最终定义了它。

上面假设远程用户的登录 shell 是类似 Bourne 的,但您应该能够使其适应大多数其他类型的 shell(csh / rc / Fish)。

答案2

鉴于您可以写入远程主机的/tmp,您可以/tmp/myhome在其上创建一个目录,将 shell 的配置文件和初始化文件放在那里,然后启动ZDOTIDR设置为 的Zsh/tmp/myhomeHOME设置为 的Bash /tmp/myhome

默认情况下,Zsh 在 中搜索其初始化文件,如果未设置则$ZDOTDIR默认为。$HOMEZDOTDIR

因此,您可以在远程主机上启动 Zsh,如下所示:

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

和 Bash 为:

ssh -t user@host HOME=/tmp/myhome bash

当然,您可以对您的配置文件/初始化文件进行创意,例如使用它们来设置HOME更合适的路径,获取其他文件(如果您碰巧在远程主机上的某个地方已经有点文件)等。

这种方法的最小应用(浓缩在一个命令中)可能是:

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

(用于mkdir -p ...防止在已经存在时显示错误/tmp/myhome,例如,如果您正在重新连接到远程主机并且您已经知道该目录在那里)。

考虑到您的ProxyCommand情况,可能是:

ssh -t -o ProxyCommand='ssh -W \
  %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
  10.0.31.122 \
  'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

最后,关于您的尝试:不起作用,因为该命令仅在交互式 shell 退出后执行。ssh -t [email protected] 'bash -l; source /tmp/my-rc'source

答案3

如果使用PAM被设定为是的在远程主机的 sshd_config 文件中,然后是配置文件/etc/pam.d/sshd允许您在成功登录以及身份验证过程中的其他事件时自动执行命令。添加这行代码

session    required     pam_exec.so /etc/myscripts/./sourcing-script

就在这些线上方

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

其中 /etc/myscripts/source-script 只是远程主机上的一个文件,其中包含成功登录后执行的命令。

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

在打开 ssh 会话之前,我使用此方法来停止服务并将其报告到日志文件。在我注销之前,我设置了一个 crontab 来启动该服务,因此它永远不会与我的 ssh 会话并行运行。

答案4

通常,您可以在$HOME/.profile或 变体中执行此操作。

ssh设置以 开头的环境变量SSH_,您可以使用这些变量来确定您是通过 登录ssh,还是直接登录。

相关内容