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
начинает писать в нее.