我想剧本涉及多个ssh和scp调用命令序列。 在日常基础上,我发现自己手动执行此任务:
从本地系统,ssh来系统1
上SYSTEM1 MKDIR / TMP /数据
从SYSTEM1,ssh来SYSTEM2
上SYSTEM2 MKDIR / TMP /数据
从SYSTEM2,SSH到系统3
SCP从系统3文件:/数据SYSTEM2:/ tmp目录/数据
出口SYSTEM2
从SYSTEM2 SCP文件:/数据和SYSTEM2:/ tmp目录/数据SYSTEM1:/ tmp目录/数据
RM -fr SYSTEM2:/ TMP /数据
出口SYSTEM1
SCP从SYSTEM1文件:/数据和SYSTEM1:/ tmp目录/数据到本地:/数据
RM -fr SYSTEM1:/ TMP /数据
我做这个过程至少每天一次,它需要大约5-10分钟不同的系统,然后进行清理之后之间正在进行。 我真的想在bash脚本自动完成这一点,但我的业余尝试至今都没有成功。 正如你可能会怀疑,该系统的通讯受到限制,这意味着地方只能看到系统1,系统2只能看到系统1和系统3,系统3只能看到系统2,等你的想法。 做这个的最好方式是什么? 此外,系统1是用于许多其他系统的轮毂,以便SYSTEM2必须由用户(系统3将始终具有相同的相对IP /主机名相比任何SYSTEM2)来指示。
我试图只是把这些命令按正确的顺序在一个shell脚本,然后手动在密码输入提示时(这已经在效率大幅度的提高),但无论是方法不工作或我的脚本的执行是错误的。 此外,我会想有,将采取一种模式,其中“系统2”连接,为数据的模式复制的脚本命令行参数,并为本地系统上的数据的目标位置。
如
./grab_data system2 *05-14* ~/grabbed-data
我做了一些搜索,我想我的下一个步骤将是让每个执行当地任务系统上的脚本,然后通过SSH命令从各自的远程系统执行脚本。 有没有更好的办法? 什么命令我应该看看用什么将是这个自动化的一般方法这种嵌套的ssh和scp的问题?
我知道我的描述可能有点令人费解,所以请要求澄清,我没有正确地描述任何区域。
谢谢。
您可以通过隧道通过其他SSH连接SSH连接简化这个过程中有很多(见这个前面的答案 )。 我会做到这一点的方法是使用以下条目在本地系统上创建的.ssh / config文件:
Host SYSTEM3
ProxyCommand ssh -e none SYSTEM2 exec /usr/bin/nc %h %p 2>/dev/null
HostName SYSTEM3.full.domain
User system3user
Host SYSTEM2
ProxyCommand ssh -e none SYSTEM1 exec /usr/bin/nc %h %p 2>/dev/null
HostName SYSTEM2.full.domain
User system2user
Host SYSTEM1
HostName SYSTEM1.full.domain
User system1user
(这是假设两者的中间宿主已安装的netcat作为在/ usr / bin中/ NC - 如果没有,你可能必须找到/安装建立通路标准输入的一些等价的方式和标准输出到一个TCP会话。)
有了这个设置,您可以使用scp SYSTEM3:/data /data
对地方,它会自动隧道穿越SYSTEM1和SYSTEM2(和索要密码的三个SYSTEMn的才能-这可能是一个有点混乱,特别是如果你输错一个)。
如果要连接到多个系统,特别是如果你有转发通过中间主机的连接,你将要使用公共密钥认证启用的ssh-agent转发。 这样,您只需要进行一次认证。
与代理转发脚本SSH可能就足够了,如果你需要做的是从你的远程命令检查退出状态,但如果你打算做什么复杂的,你可能会更好使用预期或期望,精简版关闭驱动SSH / SCP会议以更灵活的方式。 尤其是想到的是设计为互动环节一个强大的替代品。
如果你坚持使用shell脚本,你的文件名改变了很多,你总是可以创造约SSH或SCP像这样的包装:
# usage: my_ssh [remote_host] [command_line]
# returns: exit status of remote command, or 255 on SSH error
my_ssh () {
local host="$1"
shift
ssh -A "$host" "$@"
}
ssh-agent和包装函数之间,你应该有你自己的努力一个合理的起点。
另一种方法可以是使用rsync,这tomatically创建任何必需的目录,如果你愿意,删除复制的源文件。
在你的情况,你可以用命令的工作
home:~$ ssh system1
system1:~$ ssh system2
system2:~$ rsync -aPSHiv system3:/data /tmp/data
system2:~$ exit
system1:~$ rsync -aPSHiv --remove-source-files system2:/tmp/data /tmp/data
system1:~$ rsync -aPSHiv system2:/data /tmp/data
system1:~$ exit
home:~$ rsync -aPSHiv --remove-source-files system1:/tmp/data /tmp/data
home:~$ rsync -aPSHiv system1:/data /data
如果你把这个与戈登的做法 ,你甚至可以减少到
home:~$ rsync -aPSHiv system1:/data/ system2:/data/ system3:/data/ /data/
需要注意的是rsync
做之间的差异...data
和...data/
-前者是指目录及其内容,后者只是内容。 如果混合起来,你可能最终与目录data
在另一个目录中data
。
再说,你如果用公共SSH密钥来代替密码工作的事情简单化。