tarballing um git branch para um servidor remoto usando um sudoer

0

Eu tenho este comando composto trabalhando para o usuário root e tenho pulado através de aros tentando fazê-lo funcionar para um sudoer (chaves rsa, ecoando o pwd, suprimindo o tty etc), mas eu não consigo passar por isso obstáculo final:

$ git archive --format=tar master | gzip -9c | ssh -t -t [email protected] "ec
ho password123 | sudo -S tar --directory=test -xvzf -"

saídas

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

Alguma ideia?

thx

    
por user240880 26.07.2013 / 01:19

1 resposta

0

Zoredache está certo: a sobrecarga de stdin é um problema. Pode ser útil se você separou os fluxos de dados alterando o comando remoto entre aspas (após o xx ) para algo como

"exec 4<&0; echo password123 | sudo -S tar --directory=test -xvzf - <&4"

Isso deve levar o stdin ao comando remoto - que é o stdin para o ssh ; isto é, a saída de gzip –– e embaralha-a no descritor de arquivo 4. Em seguida, você echo a senha e canaliza-a para sudo –S e, em seguida, executa a tar com a entrada do descritor de arquivo 4, que é o fluxo de dados salvo (a saída de gzip ).

OK, isso provavelmente não funcionará, porque sudo e tar estão muito acoplados. Então, tente

"exec 4<&0; echo password123 | sudo -S sh –c \"tar --directory=test -xvzf - <&4\""

Isso deve fornecer a camada extra de separação entre sudo e tar para permitir que sudo leia a senha e tar leia a saída de gzip .

OK, lembrei-me de que os descritores de arquivo numerados 3 e superiores no shell não são realmente os descritores de arquivo com esses números; eles são apenas identificadores arbitrários usados dentro do shell. Então eles não transferem de uma instância de shell para outra. Então vamos dar a manivela outra vez, e tente

'myfifo=/tmp/myfifo.$$; mkfifo "$myfifo"; cat > "$myfifo"& sleep 1; echo password123 | sudo -S sh –c "tar --directory=test -xvzf - < \"$myfifo\""; rm "$myfifo"'

Eu coloquei todo o comando remoto em aspas simples para que nenhum dos cifrões fosse interpretado localmente. Eu posso ter citado mais do que realmente precisava. O sleep 1 é diminuir a probabilidade de uma condição de corrida em que o tar começa a ler do FIFO antes que o cat comece a gravar nele.

    
por 26.07.2013 / 02:37

Tags