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

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

这是一个非常基本的问题,我对 bash 很陌生,不知道如何做到这一点。不幸的是,谷歌搜索没有找到我的任何地方。

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

我有以下脚本:

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 [email protected]:/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

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

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

谢谢

答案1

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

#!/bin/bash

sftp -oPort=23 [email protected]:/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

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

答案2

您可能更喜欢使用scp而不是sftp.scp其行为与普通cp命令非常相似,但文件可以是远程的:

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar [email protected]:/home/kalenpw/TestWorld/plugins

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

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

答案3

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

例如,您可以将所有命令放入文件中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

并运行sftp为:

sftp -oPort=23 -b sftp_commands.txt [email protected]:/home/kalenpw/TestWorld/plugins 

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

man sftp

-b 批处理文件

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

答案4

另一种选择是使用卷曲

curl -u user -T file.tar sftp://example.com/home/user/

相关内容