使用X11转发的rsync未设置DISPLAY变量的问题求助
解决rsync+ssh-X+sudo在Manjaro上DISPLAY未设置的问题
问题根源
单独执行ssh -X user@server 'sudo ls'能正常弹出密码窗口,但rsync调用时却提示Can't open display:,本质是rsync通过ssh发送命令时,远程的sudo进程没有继承到DISPLAY环境变量——直接ssh登录时shell会自动加载环境变量,但rsync是直接执行远程命令,跳过了shell的环境初始化环节。
解决方案
方案1:手动传递DISPLAY变量到远程sudo命令
修改rsync命令,把本地的DISPLAY变量直接注入到远程的rsync-path中:
rsync -Payz --delete --recursive -e "ssh -X" --rsync-path="DISPLAY=$DISPLAY sudo -A rsync" user@server:backup .
这样远程的sudo进程就能拿到DISPLAY值,ssh-askpass可以在你的Manjaro笔记本上弹出密码窗口。
方案2:修改服务器sudoers配置(更省心)
如果不想每次命令都带DISPLAY参数,可以在Debian服务器上配置sudo允许保留DISPLAY变量,或者直接给你的用户免密执行rsync权限:
- 登录服务器,执行
sudo visudo编辑sudoers文件 - 添加以下任意一行:
- 免密执行rsync(最省事,注意安全):
your_server_username ALL=(ALL) NOPASSWD: /usr/bin/rsync - 让sudo保留DISPLAY环境变量:
Defaults env_keep += "DISPLAY"
- 免密执行rsync(最省事,注意安全):
- 保存退出后,再执行原来的rsync命令即可正常工作。
验证方法
执行修改后的命令后,如果弹出密码输入窗口,输入服务器用户的sudo密码就能正常同步root属主的文件了。
内容的提问来源于stack exchange,提问作者Eternal
相关产品推荐
相关产品推荐

