linux rsync with X11-Forwarding does not set DISPLAY?[关闭]

ttygqcqt  于 2023-05-22  发布在  Linux
关注(0)|答案(1)|浏览(148)

**关闭。**这个问题是not about programming or software development。目前不接受答复。

这个问题似乎不是关于a specific programming problem, a software algorithm, or software tools primarily used by programmers的。如果你认为这个问题与another Stack Exchange site的主题有关,你可以留下评论,解释在哪里可以回答这个问题。
2天前关闭。
Improve this question

部分上下文:

  • 我的Debian服务器上运行着一些服务,时不时地我想对相关数据进行备份
  • 我在服务器上有一个backup目录,我通过停止服务手动更新该目录,将数据复制到该目录(使用rsync -Payz --delete --recursive,它保留元数据并避免不必要的复制),然后重新启动服务
  • 我想在我的笔记本电脑上有一个backup目录的副本,并保持更新
  • 为此,我想运行类似rsync -Payz --delete --recursive user@server:backup .的代码
  • 这里的主要困难是,许多文件的所有者是root,不允许rsync在没有sudo的情况下移动它们(服务在容器中运行,这些权限在容器级别是有意义的,但在主机级别,系统认为主机的root是所有者)
  • 要创建服务器备份,我可以简单地调用sudo rsync,但对于笔记本电脑上的副本,我必须告诉rsync在服务器上运行sudo rsync,并将密码请求转发给客户端,这将我们带到了当前的问题
    我做了什么

我遵循了this post的建议,所以我运行的完整命令是

rsync -Payz --delete --recursive -e "ssh -X" --rsync-path="sudo -A rsync" user@server:backup .
  • --rsync-path="sudo rsync"用于在远程上运行具有sudo权限的rsync
  • 使用--rsync-path="sudo -A rsync",以便sudo依赖ssh-askpass获取密码
  • -e "ssh -X"启用X11-Forwarding,以便ssh-askpass可以要求我在笔记本电脑上键入密码
  • 问题 *
  • 这曾经在我的旧笔记本电脑(MacBook)上使用,但在我的新笔记本电脑(运行Manjaro发行版)上没有。鉴于链接的帖子的评论说它在Ubuntu上工作,我假设我需要改变我的配置中的一些东西,或者我可能缺少一个依赖项或其他东西,但我不知道是什么或为什么
  • 我得到的错误如下:
Error: Can't open display: 
sudo: no password was provided
sudo: a password is required
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [Receiver=3.2.7]
  • 当我使用-e "ssh -Xv"运行该命令时,出现以下行,似乎是问题所在
debug1: X11 forwarding requested but DISPLAY not set
debug1: Sending command: sudo -A rsync --server --sender -logDtprze.iLsfxCIvu . backup
Error: Can't open display: 
sudo: no password was provided
sudo: a password is required
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
debug1: channel 0: free: client-session, nchannels 1
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
Transferred: sent 2176, received 2464 bytes, in 0.2 seconds
Bytes per second: sent 9432.6, received 10681.1
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [Receiver=3.2.7]

因此,显然当rsync在此处运行ssh -X时,DISPLAY变量未设置

  • 但是如果我运行ssh -X 'echo $DISPLAY,它会显示localhost:10.0,并且运行ssh -X user@server 'sudo ls'会像预期的那样询问我密码(通过标题为“OpenSSH Authentification Passrase Request”的窗口)
  • 我相信这意味着问题出在ssh -Xrsync之间的交互上,而不是X11-Forwarding本身,但我不知道我做错了什么
kmpatx3s

kmpatx3s1#

我只能建议您跟踪通过rsync传递的环境,如下所示。添加选项-n以不进行传输,并使用一些/tmp/dummy文件。在命令前面加上strace,使用选项-v查看execve()调用期间的环境,-f跟随子节点,-o log输出到某个日志文件。比如说

DISPLAY=:0 strace -vf -o /tmp/log rsync -n -Payz  --delete --recursive \
 -e 'ssh -X' --rsync-path='sudo -A rsync' user@server:/tmp/dummy /tmp/dummy

浏览日志文件时,您应该看到如下内容

5261  execve("/usr/bin/ssh", ["ssh", "-X", "-l", "user", "server", 
 "sudo -A rsync", "--server", "--sender", "-nlogDtprze.iLsfxC", ".",
 "/tmp/dummy"], ["DISPLAY=:0", "SHELL=/usr/bin/bash", ...] <unfinished ...>

(one长线)。在这个示例输出中,5261是进程id。
/usr/bin/sshexecve()系统调用显示了第一个数组[...]中的ssh的参数,以及传递给第二个数组[..."DISPLAY=:0"...]中的命令的环境。确保“DISPLAY=:0”在第二个数组中。如果不是,则在文件前面查找rsync的第一个execve(),看看它是否在那里。请注意,您可能需要忽略许多execve的ssh的尝试和失败,因为每个目录在当前PATH是尝试。
您可以将第二个-f添加到strace以获得单独的日志文件,每个进程一个,而不是全部混合。

相关问题