WindowsからCygwin経由でCentOSにファイルを転送する
概要
TODO
とりあえずメモ程度。動くかどうかはまだ確かめていない。
ファイルなど
コマンドプロンプト
C:\>type D:\somewhere\filelist.txt | D:\somewhere\foo.cmd "hoge"
D:\somewhere\filelist.txt
Shift_JIS を想定している。日本語を含むパスは NG と想定している。
C:\Program Files (x86)\...\file1.txt D:\新しいフォルダ\file2.txt
D:\somewhere\foo.cmd
@echo off set BASH=C:\cygwin\bin\bash.exe set DIR_PATH=~%dp0 set SCRIPT_FILE=./foo.sh set DEST_DIR=%1 "%BASH%" --login -i -c "cat /dev/stdin | dos2unix | cygpath -f - | (cd '%DIR_PATH%'; bash '%SCRIPT_FILE%' '%DEST_DIR%')"
D:\somewhere\foo.sh
#!/bin/bash HOST=desthost USER=ayweak PRIVATE_KEY_FILE_PATH=$(dirname $0)/id_rsa.fuga if [ $# -eq 0 ]; then exit 1 fi DEST_DIR=$1 cat /dev/stdin | \ while read line do if [ -f $line ]; then echo "$line" fi done | tar -zcf - -T - | ssh -i "$PRIVATE_KEY_FILE_PATH" $USER@$HOST "$DEST_DIR"
desthost:~/bin/bar.sh
#!/bin/bash DEST_ROOT_DIR_PATH=/path/to/dest if ! $(echo "$SSH_ORIGINAL_COMMAND" | grep -q '^[a-zA-Z_][a-zA-Z0-9_]*$'); then exit 1 fi DEST_DIR=$SSH_ORIGINAL_COMMAND if [ ! -e "$DEST_ROOT_DIR_PATH/$DEST_DIR" ]; then mkdir "$DEST_ROOT_DIR_PATH/$DEST_DIR" fi TEMP_DIR_PATH=$(mktemp -d) tar -zxf - -C $TEMP_DIR_PATH find $TEMP_DIR_PATH -type f -print0 | xargs -0 chmod 644 find $TEMP_DIR_PATH -type f -print0 | xargs -0 mv -t "$DEST_ROOT_DIR_PATH/$DEST_DIR" rm -rf $TEMP_DIR_PATH