sftp 命令详解#
sftp 命令是 Linux 系统中用于通过 SSH 协议安全地传输文件的命令,是文件操作中常用的命令之一。本文将从入门到无敌,详细介绍 sftp 命令的使用方法和技巧。
入门阶段#
基本用法#
sftp 命令的基本语法:
sftp [选项] [用户@]主机功能:通过 SSH 协议在本地和远程系统之间安全地传输文件。sftp 命令提供了一个交互式的界面,允许用户执行各种文件传输操作,如上传、下载、列出文件等。
常用示例#
连接到远程服务器:
sftp user@remote连接到指定端口的远程服务器:
sftp -P 2222 user@remote使用 SSH 密钥连接:
sftp -i /path/to/key user@remote从远程服务器下载文件:
sftp> get remote_file.txt上传文件到远程服务器:
sftp> put local_file.txt
中级阶段#
常用选项#
| 选项 | 说明 |
|---|---|
-P, --port PORT | 指定远程 SSH 端口 |
-i, --identity-file FILE | 指定 SSH 私钥文件 |
-v, --verbose | 详细模式,显示传输过程 |
-b, --batch-file FILE | 从批处理文件中读取命令 |
-s, --subsystem SUB | 指定 SSH 子系统 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
常用 sftp 命令#
| 命令 | 说明 |
|---|---|
ls [路径] | 列出远程目录内容 |
lls [路径] | 列出本地目录内容 |
cd 路径 | 更改远程目录 |
lcd 路径 | 更改本地目录 |
pwd | 显示远程当前目录 |
lpwd | 显示本地当前目录 |
get 远程文件 [本地文件] | 下载远程文件 |
put 本地文件 [远程文件] | 上传本地文件 |
get -r 远程目录 [本地目录] | 递归下载远程目录 |
put -r 本地目录 [远程目录] | 递归上传本地目录 |
rm 远程文件 | 删除远程文件 |
rmdir 远程目录 | 删除远程目录 |
mkdir 远程目录 | 创建远程目录 |
rename 旧名称 新名称 | 重命名远程文件 |
chmod 权限 远程文件 | 修改远程文件权限 |
exit 或 quit | 退出 sftp 会话 |
组合使用示例#
使用批处理文件执行 sftp 命令:
# 创建批处理文件 cat > sftp_batch.txt << 'EOF' cd /remote/path lcd /local/path get remote_file.txt put local_file.txt exit EOF # 执行批处理文件 sftp -b sftp_batch.txt user@remote使用
sftp命令和find命令结合使用:# 查找本地文件并上传 find . -name "*.txt" -type f | xargs -I {} sftp -b - user@remote << 'EOF' put {} EOF使用
sftp命令和grep命令结合使用:# 查找远程文件并下载 sftp user@remote << 'EOF' ls -la get $(ls -la | grep "test" | awk '{print $9}') exit EOF使用
sftp命令和bash脚本结合使用:# 创建脚本执行 sftp 操作 cat > sftp_backup.sh << 'EOF' #!/bin/bash remote_user="user" remote_host="remote" remote_dir="/backup" local_dir="/home/user" echo "开始备份到 $remote_host:$remote_dir" sftp "$remote_user@$remote_host" << 'EOF' cd $remote_dir lcd $local_dir put -r . exit EOF echo "备份完成" EOF chmod +x sftp_backup.sh ./sftp_backup.sh
高级阶段#
高级使用示例#
使用
sftp命令和tar命令结合使用:# 压缩本地目录并上传 tar -czf - /local/path/ | sftp -b - user@remote << 'EOF' put - test.tar.gz exit EOF使用
sftp命令和dd命令结合使用:# 传输磁盘镜像 dd if=/dev/sda bs=1M count=100 | sftp -b - user@remote << 'EOF' put - disk.img exit EOF使用
sftp命令和awk命令结合使用:# 下载大小大于 1MB 的远程文件 sftp user@remote << 'EOF' ls -la $(ls -la | awk '$5 > 1048576 {print "get " $9}') exit EOF使用
sftp命令和sed命令结合使用:# 重命名远程文件 sftp user@remote << 'EOF' ls -la $(ls -la | sed -n 's/.*\(file[0-9]\.txt\)/rename \1 new_\1/p') exit EOF使用
sftp命令和cron结合使用:# 创建定时备份任务 crontab -e # 添加以下内容(每天凌晨 1 点执行备份) # 0 1 * * * sftp -b /path/to/sftp_batch.txt user@remote > /var/log/sftp.log 2>&1使用
sftp命令和expect命令结合使用:# 安装 expect(Ubuntu/Debian) # sudo apt install expect # 创建自动登录脚本 cat > sftp_auto_login.exp << 'EOF' #!/usr/bin/expect set timeout 30 set user "user" set host "remote" set password "password" spawn sftp $user@$host expect "password:" send "$password\r" expect "sftp>" send "put local_file.txt\r" expect "sftp>" send "exit\r" expect eof EOF chmod +x sftp_auto_login.exp ./sftp_auto_login.exp
大师阶段#
复杂组合命令#
与
ssh命令结合使用:# 先在远程创建目录,然后上传文件 ssh user@remote "mkdir -p /path/to/dir/" && sftp user@remote << 'EOF' put local_file.txt /path/to/dir/ exit EOF与
rsync命令结合使用:# 使用 rsync 通过 SSH 同步(更高效) rsync -avz -e ssh /local/path/ user@remote:/path/to/dir/与
systemd结合使用:# 创建系统服务文件 sudo nano /etc/systemd/system/sftp-backup.service # 添加以下内容 [Unit] Description=SFTP Backup Service After=network.target [Service] Type=simple ExecStart=/bin/bash -c 'sftp user@remote << EOF put -r /home/user/ /backup/ exit EOF' Restart=always [Install] WantedBy=multi-user.target # 启用并启动服务 sudo systemctl enable sftp-backup.service sudo systemctl start sftp-backup.service与
inotifywait结合使用:# 安装 inotify-tools(Ubuntu/Debian) # sudo apt install inotify-tools # 创建实时上传脚本 cat > realtime_sftp.sh << 'EOF' #!/bin/bash local_dir="/home/user" remote_user="user" remote_host="remote" remote_dir="/backup" echo "开始实时上传 $local_dir 到 $remote_host:$remote_dir" inotifywait -m -r -e modify,create,delete,move "$local_dir" | while read event; do echo "检测到变化:$event" sftp "$remote_user@$remote_host" << 'EOF' put -r "$local_dir/" "$remote_dir/" exit EOF done EOF chmod +x realtime_sftp.sh ./realtime_sftp.sh与
curl命令结合使用:# 使用 curl 通过 SFTP 上传文件 curl -T local_file.txt sftp://user:password@remote/path/to/dir/与
wget命令结合使用:# 使用 wget 通过 SFTP 下载文件 wget sftp://user:password@remote/path/to/file.txt
与其他命令结合使用#
与
ls命令结合使用:# 查看本地文件并上传 ls -la local_file.txt && sftp user@remote << 'EOF' put local_file.txt exit EOF与
chmod命令结合使用:# 上传文件并修改远程文件权限 sftp user@remote << 'EOF' put local_file.txt chmod 755 local_file.txt exit EOF与
chown命令结合使用:# 上传文件并修改远程文件所有者 sftp user@remote << 'EOF' put local_file.txt exit EOF ssh user@remote "chown user:group /path/to/dir/local_file.txt"与
du命令结合使用:# 查看本地文件大小并上传 du -sh local_file.txt && sftp user@remote << 'EOF' put local_file.txt exit EOF与
df命令结合使用:# 查看远程目录所在文件系统的空间并上传 ssh user@remote "df -h /path/to/dir/" && sftp user@remote << 'EOF' put local_file.txt /path/to/dir/ exit EOF
无敌阶段#
自定义 sftp 命令别名#
为了提高工作效率,可以在 .bashrc 或 .bash_profile 文件中为 sftp 命令创建别名:
# 在 ~/.bashrc 文件中添加以下内容
alias sftp='sftp -v'
# 简化 sftp 命令,使用详细模式
alias sftpp='sftp -P 2222'
# 使用指定端口
alias sftpi='sftp -i /path/to/key'
# 使用指定私钥
alias sftpb='sftp -b'
# 使用批处理文件添加后,执行 source ~/.bashrc 使别名生效。
高级技巧#
使用
sftp命令和bash函数结合使用:# 创建函数执行 sftp 操作 function sftp_upload() { local local_file="$1" local remote_path="$2" local remote_user="$3" local remote_host="$4" if [ -z "$local_file" ] || [ -z "$remote_path" ] || [ -z "$remote_user" ] || [ -z "$remote_host" ]; then echo "用法:$FUNCNAME <本地文件> <远程路径> <远程用户> <远程主机>" return 1 fi echo "上传 $local_file 到 $remote_user@$remote_host:$remote_path" sftp "$remote_user@$remote_host" << 'EOF' put "$local_file" "$remote_path" exit EOF echo "上传完成" } # 使用函数 sftp_upload local_file.txt /path/to/dir/ user remote使用
sftp命令和bash数组结合使用:# 存储多个上传任务 sftp_tasks=( "local_file1.txt user@remote:/path/to/dir/" "local_file2.txt user@remote:/path/to/dir/" "local_file3.txt user@remote:/path/to/dir/" ) for task in "${sftp_tasks[@]}"; do echo "执行上传任务:$task" local_file=$(echo "$task" | awk '{print $1}') remote_info=$(echo "$task" | awk '{$1=""; print $0}') sftp "$remote_info" << 'EOF' put "$local_file" exit EOF done使用
sftp命令和timeout结合使用:# 执行 sftp 操作,超时后退出 timeout 3600 sftp user@remote << 'EOF' put -r /local/path/ exit EOF使用
sftp命令和bash协程结合使用:# 启动协程:执行 sftp 操作 coproc sftp_process { sftp user@remote << 'EOF' put local_file.txt exit EOF } # 读取协程输出 while read -u "${sftp_process[0]}" line; do echo "$line" done # 等待协程完成 wait "${sftp_process[0]}" echo "上传完成"使用
sftp命令和journalctl结合使用:# 查看 sftp 服务的日志 sudo journalctl -u sshd.service | grep "sftp"使用
sftp命令和systemctl结合使用:# 查看 SSH 服务的状态(SFTP 依赖 SSH) sudo systemctl status sshd.service
性能优化#
使用
sftp命令的正确选项:# 推荐:使用合适的选项组合 sftp -P 2222 -i /path/to/key user@remote # 不推荐:使用过多不必要的选项 sftp -v -P 2222 -i /path/to/key user@remote使用
sftp命令和tar命令结合使用:# 推荐:对于大量小文件,先压缩再上传 tar -czf - /local/path/ | sftp user@remote << 'EOF' put - archive.tar.gz exit EOF # 不推荐:直接上传大量小文件 sftp user@remote << 'EOF' put -r /local/path/ exit EOF使用
rsync命令代替sftp命令:# 推荐:对于增量同步,使用 rsync rsync -avz -e ssh /local/path/ user@remote:/path/to/dir/ # 不推荐:对于增量同步,使用 sftp sftp user@remote << 'EOF' put -r /local/path/ exit EOF使用
sftp命令的批处理模式:# 推荐:在脚本中使用批处理模式 cat > sftp_batch.txt << 'EOF' put local_file1.txt put local_file2.txt put local_file3.txt exit EOF sftp -b sftp_batch.txt user@remote # 不推荐:在脚本中使用交互式模式 sftp user@remote << 'EOF' put local_file1.txt put local_file2.txt put local_file3.txt exit EOF使用
sftp命令和nice命令结合使用:# 降低 sftp 进程的优先级,减少对系统的影响 nice -n 19 sftp user@remote << 'EOF' put -r /local/path/ exit EOF
总结#
sftp 命令是 Linux 系统中用于通过 SSH 协议安全地传输文件的重要命令,掌握其各种选项和使用技巧,可以帮助你更高效地进行文件传输。从入门到无敌,本文涵盖了 sftp 命令的所有重要用法,希望对你有所帮助。
常用选项总结#
| 选项 | 说明 |
|---|---|
-P, --port PORT | 指定远程 SSH 端口 |
-i, --identity-file FILE | 指定 SSH 私钥文件 |
-v, --verbose | 详细模式,显示传输过程 |
-b, --batch-file FILE | 从批处理文件中读取命令 |
-s, --subsystem SUB | 指定 SSH 子系统 |
常用 sftp 命令总结#
| 命令 | 说明 |
|---|---|
ls [路径] | 列出远程目录内容 |
lls [路径] | 列出本地目录内容 |
cd 路径 | 更改远程目录 |
lcd 路径 | 更改本地目录 |
pwd | 显示远程当前目录 |
lpwd | 显示本地当前目录 |
get 远程文件 [本地文件] | 下载远程文件 |
put 本地文件 [远程文件] | 上传本地文件 |
get -r 远程目录 [本地目录] | 递归下载远程目录 |
put -r 本地目录 [远程目录] | 递归上传本地目录 |
最佳实践#
使用合适的选项组合:根据实际需求选择合适的选项,如
-P用于指定端口,-i用于指定私钥,-b用于批处理模式。使用 SSH 密钥认证:在远程传输时,使用 SSH 密钥认证代替密码认证,提高安全性和自动化程度。
使用
tar命令结合使用:对于大量小文件,先压缩再传输可以提高传输效率。使用
rsync命令代替:对于增量复制,使用rsync命令可以更高效地传输文件,因为它只传输变化的部分。使用批处理文件:对于复杂的 sftp 操作,使用批处理文件可以提高命令的可读性和可维护性。
测试 sftp 命令:在执行重要的 sftp 操作前,先测试命令的正确性,确保文件能够正确传输。
通过不断练习和使用,你将能够熟练掌握 sftp 命令的各种技巧,成为 Linux 文件传输的高手。