Linux 带有管道操作的长 shell 命令
Linux a long shell command with pipe operation
这是我的命令。
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
。但我想运行它自动,这种情况不是我想要的。
如果我将命令更改为
ssh username@hostname "cd /usr ; echo \"password\" | sudo -S tar cpf - . --ignore-failed-read" | echo "password" | sudo -S tar xpf - -C /usr
。在这种情况下我无法获取前tar数据流。
那么我怎样才能同时得到前一个tar数据流并给后一个tar命令sudo
呢?
PS: 我不想创建实际的 tar 文件。我希望它在运行时压缩和解压缩。
谁能帮帮我?非常感谢~!
将数据通过管道传输到 fifo,从标准输入读取密码:
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'
这是我的命令。
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
。但我想运行它自动,这种情况不是我想要的。
如果我将命令更改为
ssh username@hostname "cd /usr ; echo \"password\" | sudo -S tar cpf - . --ignore-failed-read" | echo "password" | sudo -S tar xpf - -C /usr
。在这种情况下我无法获取前tar数据流。
那么我怎样才能同时得到前一个tar数据流并给后一个tar命令sudo
呢?
PS: 我不想创建实际的 tar 文件。我希望它在运行时压缩和解压缩。
谁能帮帮我?非常感谢~!
将数据通过管道传输到 fifo,从标准输入读取密码:
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'