サーバーのnetcatが送信したばかりのファイルを処理するスクリプトを実行し、そのスクリプトの出力をクライアントに応答として送信したいと思います。私がすることは:
受信サイトから:
nc.traditional -l -p 2030 -e "./execute.sh" > file.iso
トランスポートサイトから:
cat file.iso - | nc.traditional -w 1 serverAddress 2030
これで、受信サイトはファイルが完全に転送される前にスクリプトを実行しますが、スクリプトの出力を転送サイトに戻して接続を閉じます。受信サイトでスクリプトを実行する前にファイルが完全に送信されるのを待ちたいです。
ベストアンサー1
送信されたファイルの終わりを受信側で認識できる方法が必要です。送信側のパイプを通るcat file - | nc
データフローは、ファイルの内容とユーザーが端末に入力する内容(cat -
端末の読み取り)を分離しません。また、デフォルトではnetcatは入力時にEOFに反応しませんが、-q
それを使用してEOFを送信できます。
したがって、受信スクリプトは次のようになります。
#!/bin/bash
filename=$1
cat > "$filename"
hash=$(shasum "$filename" |sed -e 's/ .*//')
printf "received file \"%s\" with SHA-1 hash %s\n" "$filename" "$hash"
cat
EOFまで入力を読み、ファイルを保存します。ファイルを受け取った後、次の内容が実行されます。ここで、スクリプトは受信したデータのSHA-256ハッシュを再送信します。
その後、受信側で以下を実行します。
$ nc.traditional -l -p 12345 -c "./receivefile.sh somefilename"
送信側から:
$ cat sourcefile | nc.traditional -q 9999 localhost 12345
received file "somefilename" with SHA-1 hash 3e8a7989ab68c8ae4a9cb0d64de6b8e37a7a42e5
上記のスクリプトはファイル名を引数として使用するため、-c
代わりに使用しましたが、質問で行ったように出力をターゲットファイル-e
にリダイレクトすることもできます。nc
送信側でもファイル名を送信するには、受信側で次の操作を実行できます。
#!/bin/bash
read -r filename
[[ $filename = */* ]] && exit 1 # exit if the filename contains slashes
cat > "$filename"
echo "received $filename"
次に送信を使用してください(echo filename; cat filename) | nc -q 9999 localhost 12345
。 (ここでリモートで提供されているファイル名にもう少し注意を払うことをお勧めします。または、ファイル転送用に設計されたファイル名を使用してください(例:)scp
。
SSHを使用する代わりに、nc
SSHを使用してこれを実行できます。
cat filename | ssh user@somehost receive.sh