Pipe script and binary data to stdin via ssh

霸气de小男生 提交于 2019-12-05 12:43:38

I came up with two solutions, both of which include the bash script and the tarball in stdin.

1. Embed base64-encoded tarball in a heredoc

In this case the server receives a bash script with the tarball is embedded inside a heredoc:

base64 -d <<'EOF_TAR' | tar -zx
<base64_tarball>
EOF_TAR

Here's the complete example:

ssh $HOST bash -s < <(
# Feed script header
cat <<'EOF'
cd /tmp
base64 -d <<'EOF_TAR' | tar -zx
EOF

# Create local tarball, and pipe base64-encoded version
tar -cz ./archive | base64

# Feed rest of script
cat <<'EOF'
EOF_TAR
./archive/some_script.sh
rm -r archive
EOF
)

In this approach however, tar does not start extracting the tarball until it is fully transferred over the network.

2. Feed tar binary data after the script

In this case the bash script is piped into stdin followed by the raw tarball data. bash passes control to tar which processes the tar portion of stdin:

ssh $HOST bash -s < <(
# Feed script.
cat <<'EOF'
function main() {
  cd /tmp
  tar -zx
  ./archive/some_script.sh
  rm -r archive
}
main
EOF
# Create local tarball and pipe it
tar -cz ./archive
)

Unlike the first approach, this one allows tar to start extracting the tarball as it is being transferred over the network.

Side note

Why do we need the main function, you ask? Why feed the entire bash script first, followed by binary tar data? Well, if the binary data were put in the middle of the bash script, there would be an error since tar consumes past the end of the tarfile, which in this case would eat up some of the bash script. So, the main function is used to force the whole bash script to come before the tar data.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!