这是一个非常基本的问题,我对 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 风格的命令界面。
ssh
、scp
和服务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/