Linux длинная команда оболочки с операцией канала - PullRequest
0 голосов
/ 29 мая 2019

Это моя команда.

ssh username@hostname "cd /usr ; echo \"password\" | sudo -S tar cpf - . --ignore-failed-read" | tar xpf - -C /usr

Проблема в том, что последней команде tar нужно sudo, поэтому, если я изменю свой код как ssh username@hostname "cd /usr ; echo \"password\" | sudo -S tar cpf - . --ignore-failed-read" | sudo tar xpf - -C /usr ut Но я хочучтобы запустить его автоматически, этот случай не тот, который я хочу.

Если я изменю команду на

ssh username@hostname "cd /usr ; echo \"password\" | sudo -S tar cpf - . --ignore-failed-read" | echo "password" | sudo -S tar xpf - -C /usr。 В этом случае я не могу получить прежний поток данных tar。

Так как я могу одновременно получить прежний поток данных tar и передать sudo моей последней команде tar?

PS: я не хочу создавать настоящий файл tar. Я хочу, чтобы он сжимался и распаковывалсяна лету.

Кто-нибудь может мне помочь?Большое спасибо ~!

1 Ответ

1 голос
/ 29 мая 2019

Передайте данные в fifo, прочитайте пароль из stdin:

trap 'rm -f /tmp/fifo' 0
mkfifo /tmp/fifo
ssh username@hostname 'cd /usr ; echo "password" |
     sudo -S tar cpf - . --ignore-failed-read' > /tmp/fifo & 
echo "${password?}" | sudo -S sh -c 'tar xpf - -C /usr < /tmp/fifo'
...