问题是这样的:我想从远程机器复制文件。
我正在寻找一种方法来写一个连接到远程机器的shell脚本,获取存储的文件的位置,一旦我从远程服务器获取位置断开连接并使用scp从本地计算机中获得的位置复制文件。
具体来说,我想知道如何从脚本,我会连接到远程机器,在该机器上执行任务。 断开连接,并在本地继续执行。
解决scheme1:
remote_output="$(ssh user@host "remote command")" scp "user@$host:$remote_output" /local/path
这通过连接到远程机器,运行一些命令,并将输出复制到本地机器上的variables来工作。 说,远程回显文件path,在本地捕获。
解决scheme2:
ssh user@host "determine_path; cat filename" >local_filename
这是通过直接从远程查找和输出文件并将其redirect到本地文件来实现的。 这跳过scp。 这要求“cat”之前的步骤没有输出(你可以用&> / dev / null来解决)。
您可以使用以下格式编写脚本:
command1 command2 ... ssh user@machine command3 ... command4 command5
您需要设置SSH密钥才能在不提示您input密码的情况下执行command3 。
我假设你已经对如何识别要复制的文件有了一些了解,并且已经可以或已经写过一个脚本或一组将在远程机器上运行的命令。
此外,我还假定这些命令在标准输出上打印文件的完整path,或相对于用于复制的SSH用户的主目录的文件的相对path。 在我的例子中,脚本的名字是“getfilepath.sh”,尽pipe它不一定是一个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.
在上面的代码中,“$()”符号是一种将命令的标准输出捕获为shellvariables的方式。 这是相当标准的,但是如果你使用的是一个不理解它的shell,你可以用“back-ticks”来包围这个命令,这是在美国大部分键盘上1键左边的重音符号。
也许有可能触发远程机器上执行所有工作的计划任务。
这将防止您在search要复制的文件的位置时连接到远程计算机。
我做这个:
在我的情况下,命令行会触发执行批处理脚本的计划任务。
schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"
最好的祝福