У меня есть эта составная команда, работающая для пользователя root, и я прыгал через обручи, пытаясь заставить ее работать на sudoer (клавиши rsa, эхо pwd, подавление tty и т.д.), Но я не могу преодолеть это последнее препятствие:

$ git archive --format=tar master | gzip -9c | ssh -t -t user1@xxx.xx.xx.xx "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 ответ1

0

Zoredache прав: перегрузка стандартного ввода - проблема.  Это может помочь, если вы разделите потоки данных, изменив указанную удаленную команду (после 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 .


ОК, мне приходит в голову, что файловые дескрипторы с номерами от 3 и выше в действительности не являются файловыми дескрипторами с этими номерами; это просто произвольные идентификаторы, используемые в оболочке.  Поэтому они не переносятся из одного экземпляра оболочки в другой.  Итак, давайте сделаем еще один поворот и попробуем

'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, прежде чем cat начинает писать в нее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .