如何在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命令:
- 登录服务器,执行
sudo visudo - 添加一行:
normal.user ALL=(superUser) NOPASSWD: /bin/mv - 保存退出即可
方法二:通过管道+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
相关产品推荐
相关产品推荐

