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:~/.ssh/authorized_keys

from="srchost",command="/home/ayweak/bin/bar.sh" ssh-rsa ...

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