使用 sudoer 将 git 分支打包到远程服务器

使用 sudoer 将 git 分支打包到远程服务器

我让这个复合命令为 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)。

好吧,这可能行不通,因为sudotar耦合太紧密了。所以,试试

"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是为了降低出现竞争条件的可能性,即在开始写入tarFIFO 之前先从 FIFO 读取数据。cat

相关内容