从本地计算机执行Shell脚本以在远程计算机中执行命令,然后在本地计算机上继续


10

问题是这样的:我想从远程计算机复制文件。

我正在寻找一种编写可以连接到远程计算机,获取存储文件位置的shell脚本的方法,一旦我断开与远程服务器的连接,并使用具有所获取位置的本地计算机中的scp复制文件。

具体来说,我想知道如何通过脚本连接到远程计算机,并在该计算机上执行任务。断开连接,然后继续在本地执行。

Answers:


15

解决方案1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

通过连接到远程计算机,运行一些命令,然后将输出复制到本地计算机上的变量来工作。说,远程回显文件路径,在本地捕获它。

解决方案2:

ssh user@host "determine_path; cat filename" >local_filename

这可以通过直接从远程查找并输出文件,然后将其重定向到本地文件来实现。这将跳过scp。这要求“ cat”之前的步骤没有输出(您可以使用&> / dev / null解决此问题)。


1
+1表示如何通过一个连接而不是单独的ssh + scp解决整个问题。
彼得·科德斯

所有的答案都是有帮助的,但这是最具体地解决我的问题的方法
gnsr

20

您可以采用以下格式编写脚本:

command1
command2
...
ssh user@machine command3
...
command4
command5

您需要设置SSH密钥才能command3执行而不会提示您输入密码。


2
应当指出,这将是同步的。虽然ssh user@remote command3运行时,command4无法启动
AAAAA说恢复莫妮卡

3
@aaaaaa,除非您这样做ssh user@machine command3 &
Isaac

3
@Isaac是的,我的意思是,这两种行为都可以是令人满意的行为,但这应该是明智的决定
aaaaa说,请恢复莫妮卡(Monica)的意愿2008年

2

我假设您已经对如何识别要复制的文件有所了解,并且已经能够或已经编写了脚本或命令集,这些脚本或命令集可以在进行此识别的远程计算机上运行。

此外,我还将假定这些命令在标准输出上打印文件的完整路径,或相对于用于复制的SSH用户的主目录的文件的相对路径。在我的示例中,脚本的名称为“ getfilepath.sh”,尽管它不一定是shell脚本,但它可以是其他可执行文件,甚至是一系列命令。

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

在上面的代码中,“ $()”表示法是一种将命令的标准输出捕获为shell变量的方法。这是相当标准的,但是如果您使用的外壳不了解它,则可以用“反斜杠”将命令括起来,反斜杠是大多数美式键盘上1键左侧的重音符号。


0

也许可以在完成所有工作的远程计算机上触发计划的任务。

这将防止您在搜索要复制的文件的位置时蜂鸣地连接到远程计算机。

我正在这样做:

comand行触发一个计划任务,该任务在我的情况下执行批处理脚本。

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

最好的祝福

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.