问题是这样的:我想从远程机器复制文件。
我正在寻找一种方法来编写一个 shell 脚本,该脚本可以连接到远程机器,获取存储文件的位置,一旦我获得该位置,就断开与远程服务器的连接,并使用本地机器内的 scp 和获得的位置来复制文件。
具体来说,我想知道如何通过脚本连接到远程计算机,在该计算机上执行任务。断开连接,然后继续在本地执行。
答案1
解决方案 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 解决)。
答案2
您可以按照以下格式编写脚本:
command1
command2
...
ssh user@machine command3
...
command4
command5
您需要设置 SSH 密钥才能command3
执行而无需提示您输入密码。
答案3
我假设您已经对如何识别要复制的文件有了一些想法,并且您能够或已经编写了将在执行此识别的远程机器上运行的脚本或命令集。
此外,我还假设这些命令在标准输出上打印文件的完整路径或文件的相对路径(相对于用于复制的 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 变量的方法。这是相当标准的,但如果您使用的 shell 无法理解它,您可以改为用“反引号”将命令括起来,反引号是大多数美国键盘上 1 键左侧的重音符号。
答案4
也许可以触发远程机器上执行所有工作的计划任务。
这会阻止您在搜索要复制的文件的位置时连接到远程机器。
我正在这样做:
命令行触发一个计划任务,在我的情况下执行批处理脚本。
schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"
此致