我让这个复合命令为 root 用户工作,并竭尽全力尝试让它为 sudoer 工作(rsa 密钥、回显 pwd、抑制 tty 等),但我似乎无法突破这最后的障碍:
$ git archive --format=tar master | gzip -9c | ssh -t -t [email protected] "ec
ho password123 | sudo -S tar --directory=test -xvzf -"
输出
tcgetattr: Not a character device
[sudo] password for user1:
gzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now
Connection to xxx.xx.xx.xx closed.
gzip: stdout: Invalid argument
有任何想法吗??
谢谢
答案1
Zoredache 是对的:stdin 的过载是一个问题。如果您通过将引用的远程命令(在 之后xx
)更改为类似以下内容来分离数据流,可能会有所帮助
"exec 4<&0; echo password123 | sudo -S tar --directory=test -xvzf - <&4"
这应该将 stdin 带到远程命令 –– 即 的 stdin ssh
;即来自 –– 的输出gzip
并将其随机移动到文件描述符 4。然后输入echo
密码并将其导入sudo –S
,然后使用tar
文件描述符 4 的输入运行 ,这是已保存的数据流(来自 的输出gzip
)。
好吧,这可能行不通,因为sudo
和tar
耦合太紧密了。所以,试试
"exec 4<&0; echo password123 | sudo -S sh –c \"tar --directory=test -xvzf - <&4\""
sudo
这应该在和之间提供额外的隔离层,tar
以允许sudo
读取密码和tar
读取的输出gzip
。
好的,我回想起来,shell 中编号为 3 及以上的文件描述符实际上并不是具有这些数字的文件描述符;它们只是 shell 中使用的任意标识符。因此它们不会从一个 shell 实例转移到另一个 shell 实例。所以让我们再试一次,然后尝试
'myfifo=/tmp/myfifo.$$; mkfifo "$myfifo"; cat > "$myfifo"& sleep 1; echo password123 | sudo -S sh –c "tar --directory=test -xvzf - < \"$myfifo\""; rm "$myfifo"'
我将整个远程命令放在单引号中,这样就不会在本地解释任何美元符号。我引用的可能比我真正需要的要多。这sleep 1
是为了降低出现竞争条件的可能性,即在开始写入tar
FIFO 之前先从 FIFO 读取数据。cat