You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中通过SSH切换超级用户完成文件传输?

问题分析与解决方案

你的原脚本无法直接实现需求,因为scp会以normal.user的权限访问远程服务器的/data/apps/transfer目录,而这个目录只有superUser能写入,直接执行会报权限错误。下面给你两种可行的解决思路:

方法一:先传临时目录再sudo移动

先把文件传到normal.user有权限的临时目录,再通过ssh执行sudo命令将文件移动到目标目录:

#!/bin/bash
file_to_upload="*.txt"
remote_username="normal.user"
remote_hostname="123.45.67.89"  # 注意修正原IP的多余点
temp_dir="/home/normal.user/temp_upload"
remote_destination_dir="/data/apps/transfer"

# 确保远程临时目录存在(可选,防止目录不存在报错)
ssh "$remote_username@$remote_hostname" "mkdir -p $temp_dir"

# 上传文件到临时目录
scp "$file_to_upload" "$remote_username@$remote_hostname:$temp_dir"

# 远程执行sudo移动文件到目标目录,然后清理临时文件
ssh "$remote_username@$remote_hostname" "sudo -u superUser mv $temp_dir/*.txt $remote_destination_dir && rm $temp_dir/*.txt"

前提配置

需要在服务器上给normal.user配置无密码sudo权限,允许它以superUser身份执行mv命令:

  1. 登录服务器,执行sudo visudo
  2. 添加一行:normal.user ALL=(superUser) NOPASSWD: /bin/mv
  3. 保存退出即可

方法二:通过管道+sudo tee直接写入目标目录

不需要临时目录,直接通过管道将文件内容传输到远程,用sudo tee以superUser权限写入目标目录:

#!/bin/bash
file_to_upload="*.txt"
remote_username="normal.user"
remote_hostname="123.45.67.89"
remote_destination_dir="/data/apps/transfer"

# 遍历所有要上传的txt文件
for file in $file_to_upload; do
  # 读取本地文件内容,通过ssh管道传给远程的sudo tee
  cat "$file" | ssh "$remote_username@$remote_hostname" "sudo -u superUser tee $remote_destination_dir/$(basename "$file") > /dev/null"
done

前提配置

同样需要在服务器sudoers里配置normal.user无密码执行tee命令:
添加一行:normal.user ALL=(superUser) NOPASSWD: /usr/bin/tee

关于scp自动断开的问题

scp本身就是单次传输工具,传输完成后自动断开连接是正常且高效的行为——没必要为了已经完成的传输维持SSH长连接。如果是需要批量执行多次传输/操作,才需要考虑SSH连接复用,但对你的单次上传需求来说,当前的断开逻辑就是最优方案。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:47:26