尝试将图像通过管道传输到 ssh stdin 输入

尝试将图像通过管道传输到 ssh stdin 输入

所以我想做的是在远程服务器上显示图像并移动它们 - 我已经想到了一种使用wmctrlImageMagick实现这一点的方法display,所以我写了一个简单的命令。

cat "$img" | ssh "beer@laika" "export DISPLAY=:0; display - & sleep 5 && wmctrl -r ImageMagick -e 0,254,600,800,560"

将、和文件作为输入$img的变量在哪里——问题是上述方法似乎不起作用,错误是。pngjpegjpg

display: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.

它似乎display没有正确接受输入,我认为某些进程已经吸收了标准输入。

我尝试调试该命令,并发现如果在display -删除之后执行的命令有效!图像将显示在我的远程服务器上。

cat "$img" | ssh "beer@laika" "export DISPLAY=:0; display -"

↑↑ 工作了 ↑↑

如果我通过 ssh 手动移动窗口,它将成功运行而不会出现任何问题。

ssh beer@laika "export DISPLAY=:0; wmctrl -r ImageMagick -e 0,254,600,750,480"

↑↑ 工作了 ↑↑

可能存在什么问题?有人能帮我解答一下吗?

答案1

问题出在标准输入上。

解决这个问题的一种方法是先传输文件(cat > filename),然后运行命令,因此您的命令行将是这样的:

cat "$img" | ssh beer@laika "export DISPLAY=:0; cat > /tmp/temporary_image;display /tmp/temporary_image &  sleep 5;wmctrl -r ImageMagick -e 0,254,600,750,480"

答案2

一般情况下,您不能将 stdin 发送到后台作业。如果进程以 开始,&则 shell 实际上会将其 stdin 从 /dev/null 重定向,以避免任何读取尝试。

(并且该进程通常是从交互式终端启动的,但是稍后按 Ctrl+Z 并按 'bg' 时,每当它尝试从终端读取时都会收到 SIGTTIN。)

因此,您需要先将图像接收到临时文件中,或者用&自定义工具替换用法。例如,使用 Python 中的“subprocess”模块或 Ruby 中的 Open3() - 它们可以让您更好地控制要传递哪些 FD。

可能可以从 shell 内部执行此操作,因为显式重定向会覆盖这一点:

display - < /dev/stdin &

实际上,最好预先指定位置并避免延迟移动。大多数 X11 程序传统上都接受该-geometry选项,因此请检查这是否有效:

display -geometry "WIDTHxHEIGHT+XOFFSET+YOFFSET" -

相关内容