通过脚本在sftp连接中执行命令

kal*_*npw 19 scripting ssh sftp file-copy

这是一个非常基本的问题,我对 bash 很陌生,无法弄清楚如何做到这一点。不幸的是,谷歌搜索没有让我到任何地方。

我的目标是使用 sftp 连接到服务器,上传文件,然后断开连接。

我有以下脚本:

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins
#Change directory on server
#cd /home/kalenpw/TestWorld/plugins

#Upload file
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar

exit
Run Code Online (Sandbox Code Playgroud)

问题是,这个脚本将建立一个 sftp 连接,然后什么都不做。一旦我在连接中手动输入 exit ,它就会尝试执行 put 命令,但由于 sftp 会话已关闭,它只显示 put: command not found。

我怎样才能让它正常工作?

谢谢

Tho*_*key 26

您可以更改脚本以在此处的文档中传递命令,例如,

#!/bin/bash

sftp -oPort=23 kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins <<EOF
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar   
exit
EOF
Run Code Online (Sandbox Code Playgroud)

<<后跟名称 ( EOF)的标记告诉脚本传递以下几行,直到在该行的开头(单独)找到该名称。


小智 10

您可能更喜欢使用scp而不是sftp. scp行为很像普通cp命令,但文件可以是远程的:

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins
Run Code Online (Sandbox Code Playgroud)

这会将您本地机器上的文件复制到远程机器上的目录中,而无需使用老式 ftp 风格的命令界面。

sshscpsftp服务通常可如果其中任何的; 同一个守护程序同时提供所有这些。原则上,服务器的管理员可以选择禁用其中任何一个,但实际上这种情况很少见。

  • 这是一个古老的讨论,但为了记录,sftp 和 scp 之间的重要区别似乎是 scp 创建多个会话以提高并行复制文件的效率,而 sftp 在会话上创建并按顺序上传文件。根据目标主机的不同,scp 命令可能被认为是激进的并且会导致失败,例如阻止您的 IP。问我怎么知道的:) (2认同)

hee*_*ayl 5

您还可以使用-b选项sftp来指示包含sftp.

例如,您可以将所有命令放在 file 中sftp_commands.txt

cd /home/kalenpw/TestWorld/plugins
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar
exit
Run Code Online (Sandbox Code Playgroud)

并运行sftp为:

sftp -oPort=23 -b sftp_commands.txt kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins 
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用文件,也可以通过 STDIN 传递命令。

来自man sftp

-b 批处理文件

批处理模式从输入批处理文件而不是标准输入中读取一系列命令。由于它缺乏用户交互,因此应与非交互式身份验证结合使用。“-”的批处理文件可用于指示标准输入。如果以下任何命令失败,sftp 将中止:get、put、reget、rename、ln、rm、mkdir、chdir、ls、lchdir、chmod、chown、chgrp、lpwd、df、symlink 和 lmkdir。可以通过 pre? 逐个命令地抑制错误终止。使用“-”字符修复命令(例如,-rm /tmp/blah*)。


Per*_*ere 5

另一种选择是使用curl

curl -u user -T file.tar sftp://example.com/home/user/
Run Code Online (Sandbox Code Playgroud)