sftp 命令详解#

sftp 命令是 Linux 系统中用于通过 SSH 协议安全地传输文件的命令,是文件操作中常用的命令之一。本文将从入门到无敌,详细介绍 sftp 命令的使用方法和技巧。

入门阶段#

基本用法#

sftp 命令的基本语法:

sftp [选项] [用户@]主机

功能:通过 SSH 协议在本地和远程系统之间安全地传输文件。sftp 命令提供了一个交互式的界面,允许用户执行各种文件传输操作,如上传、下载、列出文件等。

常用示例#

  1. 连接到远程服务器

    sftp user@remote
  2. 连接到指定端口的远程服务器

    sftp -P 2222 user@remote
  3. 使用 SSH 密钥连接

    sftp -i /path/to/key user@remote
  4. 从远程服务器下载文件

    sftp> get remote_file.txt
  5. 上传文件到远程服务器

    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 权限 远程文件修改远程文件权限
exitquit退出 sftp 会话

组合使用示例#

  1. 使用批处理文件执行 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
  2. 使用 sftp 命令和 find 命令结合使用

    # 查找本地文件并上传
    find . -name "*.txt" -type f | xargs -I {} sftp -b - user@remote << 'EOF'
    put {}
    EOF
  3. 使用 sftp 命令和 grep 命令结合使用

    # 查找远程文件并下载
    sftp user@remote << 'EOF'
    ls -la
    get $(ls -la | grep "test" | awk '{print $9}')
    exit
    EOF
  4. 使用 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

高级阶段#

高级使用示例#

  1. 使用 sftp 命令和 tar 命令结合使用

    # 压缩本地目录并上传
    tar -czf - /local/path/ | sftp -b - user@remote << 'EOF'
    put - test.tar.gz
    exit
    EOF
  2. 使用 sftp 命令和 dd 命令结合使用

    # 传输磁盘镜像
    dd if=/dev/sda bs=1M count=100 | sftp -b - user@remote << 'EOF'
    put - disk.img
    exit
    EOF
  3. 使用 sftp 命令和 awk 命令结合使用

    # 下载大小大于 1MB 的远程文件
    sftp user@remote << 'EOF'
    ls -la
    $(ls -la | awk '$5 > 1048576 {print "get " $9}')
    exit
    EOF
  4. 使用 sftp 命令和 sed 命令结合使用

    # 重命名远程文件
    sftp user@remote << 'EOF'
    ls -la
    $(ls -la | sed -n 's/.*\(file[0-9]\.txt\)/rename \1 new_\1/p')
    exit
    EOF
  5. 使用 sftp 命令和 cron 结合使用

    # 创建定时备份任务
    crontab -e
    
    # 添加以下内容(每天凌晨 1 点执行备份)
    # 0 1 * * * sftp -b /path/to/sftp_batch.txt user@remote > /var/log/sftp.log 2>&1
  6. 使用 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

大师阶段#

复杂组合命令#

  1. ssh 命令结合使用

    # 先在远程创建目录,然后上传文件
    ssh user@remote "mkdir -p /path/to/dir/" && sftp user@remote << 'EOF'
    put local_file.txt /path/to/dir/
    exit
    EOF
  2. rsync 命令结合使用

    # 使用 rsync 通过 SSH 同步(更高效)
    rsync -avz -e ssh /local/path/ user@remote:/path/to/dir/
  3. 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
  4. 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
  5. curl 命令结合使用

    # 使用 curl 通过 SFTP 上传文件
    curl -T local_file.txt sftp://user:password@remote/path/to/dir/
  6. wget 命令结合使用

    # 使用 wget 通过 SFTP 下载文件
    wget sftp://user:password@remote/path/to/file.txt

与其他命令结合使用#

  1. ls 命令结合使用

    # 查看本地文件并上传
    ls -la local_file.txt && sftp user@remote << 'EOF'
    put local_file.txt
    exit
    EOF
  2. chmod 命令结合使用

    # 上传文件并修改远程文件权限
    sftp user@remote << 'EOF'
    put local_file.txt
    chmod 755 local_file.txt
    exit
    EOF
  3. chown 命令结合使用

    # 上传文件并修改远程文件所有者
    sftp user@remote << 'EOF'
    put local_file.txt
    exit
    EOF
    ssh user@remote "chown user:group /path/to/dir/local_file.txt"
  4. du 命令结合使用

    # 查看本地文件大小并上传
    du -sh local_file.txt && sftp user@remote << 'EOF'
    put local_file.txt
    exit
    EOF
  5. 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 使别名生效。

高级技巧#

  1. 使用 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
  2. 使用 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
  3. 使用 sftp 命令和 timeout 结合使用

    # 执行 sftp 操作,超时后退出
    timeout 3600 sftp user@remote << 'EOF'
    put -r /local/path/
    exit
    EOF
  4. 使用 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 "上传完成"
  5. 使用 sftp 命令和 journalctl 结合使用

    # 查看 sftp 服务的日志
    sudo journalctl -u sshd.service | grep "sftp"
  6. 使用 sftp 命令和 systemctl 结合使用

    # 查看 SSH 服务的状态(SFTP 依赖 SSH)
    sudo systemctl status sshd.service

性能优化#

  1. 使用 sftp 命令的正确选项

    # 推荐:使用合适的选项组合
    sftp -P 2222 -i /path/to/key user@remote
    
    # 不推荐:使用过多不必要的选项
    sftp -v -P 2222 -i /path/to/key user@remote
  2. 使用 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
  3. 使用 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
  4. 使用 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
  5. 使用 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 本地目录 [远程目录]递归上传本地目录

最佳实践#

  1. 使用合适的选项组合:根据实际需求选择合适的选项,如 -P 用于指定端口,-i 用于指定私钥,-b 用于批处理模式。

  2. 使用 SSH 密钥认证:在远程传输时,使用 SSH 密钥认证代替密码认证,提高安全性和自动化程度。

  3. 使用 tar 命令结合使用:对于大量小文件,先压缩再传输可以提高传输效率。

  4. 使用 rsync 命令代替:对于增量复制,使用 rsync 命令可以更高效地传输文件,因为它只传输变化的部分。

  5. 使用批处理文件:对于复杂的 sftp 操作,使用批处理文件可以提高命令的可读性和可维护性。

  6. 测试 sftp 命令:在执行重要的 sftp 操作前,先测试命令的正确性,确保文件能够正确传输。

通过不断练习和使用,你将能够熟练掌握 sftp 命令的各种技巧,成为 Linux 文件传输的高手。