2MUCH

SFTP基础学习

2023-05-28


概念知识

FTP vs SFTP

FTP(file transfer protocol):

Using the client/server model, FTP supports the direct transfer of files between your chosen FTP client and your web server. by https://kinsta.com/knowledgebase/ftp-vs-sftp/

SFTP(ssh|secure file transfer protocol,安全文件传输协议): 实现功能和FTP一样,但是通过SSH(a secure channel)提供安全的文件传输。具体来说:the data moves between your FTP client and your web server is encrpted.

SFTP常用命令

# 登陆(若不指定用户名,则默认用当前的用户名登陆)
sftp user@ip 
sftp user@域名
# 远程操作
# 本地操作就是在命令前面加l
ls
cd
mkdir
rmdir
put
get
pwd
chgrp # change group of path
chmod # change privileges of path
chown # change owner of path

如何通过sftp判断远程主机的某文件是否存在

首先,需要明确的是,sftp没有直接的命令来判断文件是否存在。但我们可以通过间接的方式来判断:

SFTP_COM="ls ${FILE_PATH} > /dev/null 2>&1"
sftp .... << EOF
	${SFTP_COM}
EOF
if [ $? -eq 0]; then
	echo "file exists"
else
	echo "file not exists"
fi

待验证

如果要实现一次sftp连接,判断多个文件是否存在。可以采用根据文件列表预先进行sftp命令拼接的方法,并在sftp命令中实现若此文件不存在,将文件名写入文件中记录。可参考chatgpt给出的解决方案:

#!/bin/bash

# SFTP connection details
SFTP_HOST="your_sftp_host"
SFTP_USER="your_sftp_username"
SFTP_PASSWORD="your_sftp_password"
FILE_LIST="file_list.txt" # 输入文件列表
OUTPUT_FILE="nonexistent_files.txt" # 输出不存在文件列表

# 清空输出文件
> "$OUTPUT_FILE"

# 构建SFTP批处理命令
sftp_command="lcd /tmp" # 设置本地目录(可选)
sftp_command+="\ncd /remote/path" # 设置远程目录(可选)

# 逐行读取文件列表并添加SFTP命令
while IFS= read -r file; do
  sftp_command+="\nstat $file >/dev/null 2>&1 || echo \"$file\" >> \"$OUTPUT_FILE\""
done < "$FILE_LIST"

# 执行SFTP批处理命令
sftp -oBatchMode=yes -b <(echo -e "$sftp_command") "$SFTP_USER@$SFTP_HOST" << EOF
$SFTP_PASSWORD
EOF

# 显示完成消息
echo "File existence check completed. Nonexistent files saved to $OUTPUT_FILE."