![ssh 登录后出现提示后获取文件](https://linux22.com/image/178661/ssh%20%E7%99%BB%E5%BD%95%E5%90%8E%E5%87%BA%E7%8E%B0%E6%8F%90%E7%A4%BA%E5%90%8E%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6.png)
单行问题:通过堡垒主机通过 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_COMMAND
if/tmp/my-rc
实际上最终定义了它。
上面假设远程用户的登录 shell 是类似 Bourne 的,但您应该能够使其适应大多数其他类型的 shell(csh / rc / Fish)。
答案2
鉴于您可以写入远程主机的/tmp
,您可以/tmp/myhome
在其上创建一个目录,将 shell 的配置文件和初始化文件放在那里,然后启动ZDOTIDR
设置为 的Zsh/tmp/myhome
和HOME
设置为 的Bash /tmp/myhome
。
默认情况下,Zsh 在 中搜索其初始化文件,如果未设置则$ZDOTDIR
默认为。$HOME
ZDOTDIR
因此,您可以在远程主机上启动 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
,还是直接登录。