Во-первых, я прочитал более десятка подобных сообщений по этому поводу, и ни одно из рекомендованных решений не работает для меня. Но я очень новичок в cygwin, поэтому, по-видимому, упускаю что-то, что предполагают эти ответы.
Пример использования: я пытаюсь создать метод для загрузки измененных файлов на сервер с компьютера для разработки Windows 10. Это для некоторых веб-разработок, когда локальный инструмент сборки сначала удаляет все существующие файлы, поэтому сравнение временных меток не годится. Я пробовал WinSCP, но он не поддерживает синхронизацию контрольных сумм (хотя я использую proftpd SFTP, который поддерживает — трекер WinSCP для этой функции не обновлялся 3 года). Если есть какой-то способ заставить WinSCP сделать это, я с радостью откажусь от всего остального ниже.
Итак, rsync по ssh с дельтами и --ignore-times
кажется хорошим решением. Обратите внимание, что сервер только принимает ssh с открытым ключом.
Я установил cygwin и с терминала cygwin настроил ssh с помощью ключа и создал файл конфигурации. Из окна терминала cygwin теперь я могу сделать:
$ ssh server.com
без проблем, а также такие вещи, как:
$ rsync -e ssh /local/source server.com:/remote/target
Теперь локальные инструменты сборки запускаются из командной строки в PowerShell, поэтому я хотел бы, в качестве последнего шага, запустить команду, которая загрузит выходные данные сборки на сервер. Вроде просто...
Во-первых, в терминале cygwin я попытался создать сценарий bash с именем deploy-dev.sh
. Если я запускаю это из терминала cygwin, все работает нормально. Но если я запущу это из PowerShell:
PS C:\cygwin64\bin> .\bash.exe /home/davidl/deploy-dev.sh
Я получаю следующую ошибку:
Warning: Identity file /home/davidl/.ssh/key.pem not accessible: No such file or directory.
Но он создал файл known_hosts
в C:\Users\davidl\.ssh
. Поэтому я скопировал туда ключ ssh. Но я все еще получаю ту же ошибку - до сих пор не знаю, почему.
Во всяком случае, с другой стороны, как насчет того, чтобы просто запустить rsync.exe
из PowerShell, а не скрипт bash:
PS C:\cygwin64\bin> .\rsync.exe -e ssh test.txt server.com:/target
Bad owner or permissions on C:\\Users\\davidl/.ssh/config
Хорошо, пока игнорируйте это и попробуйте загрузить ключ напрямую:
PS C:\cygwin64\bin> .\rsync.exe -e "ssh -i C:\Users\davidl\.ssh\key.pem" test.txt [email protected]:/target
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\Users\\davidl\\.ssh\\key.pem' are too open.
Прогресс! Он ищет нужный файл. Итак, о разрешениях:
PS C:\cygwin64\bin> .\ls.exe -al C:\Users\davidl\.ssh\
total 14
drwxr-xr-x 1 davidl None 0 Aug 8 19:04 .
drwxr-xr-x 1 davidl None 0 Aug 8 18:33 ..
-rw-r--r-- 1 davidl None 1692 Aug 8 19:02 key.pem
-rw-r--r-- 1 davidl None 94 Aug 8 19:04 config
-rw-r--r-- 1 davidl None 187 Aug 8 19:02 known_hosts
Хм. Это не выглядит правильно. Итак, исправьте это с помощью chgrp
и chown
в соответствии со многими ответами, опубликованными о таких вещах:
PS C:\cygwin64\bin> .\chgrp.exe -R :Users C:\Users\davidl\.ssh\
/usr/bin/chgrp: invalid group: ':Users'
Хорошо, может быть, просто разрешений будет достаточно:
PS C:\cygwin64\bin> .\chmod.exe -R 600 C:\Users\davidl\.ssh\
PS C:\cygwin64\bin> .\ls.exe -al C:\Users\davidl\.ssh\
total 14
drwxr-xr-x 1 davidl None 0 Aug 8 19:04 .
drwxr-xr-x 1 davidl None 0 Aug 8 18:33 ..
-rw-r--r-- 1 davidl None 1692 Aug 8 19:02 key.pem
-rw-r--r-- 1 davidl None 94 Aug 8 19:04 config
-rw-r--r-- 1 davidl None 187 Aug 8 19:02 known_hosts
Так что теперь я застрял. Я не могу установить правильную группу или разрешения для локальных файлов через cygwin, и, глядя на них внутри терминала cygwin, разрешения все равно выглядят правильно:
davidl@DESKTOP2 /cygdrive/c/Users/davidl/.ssh
$ ls -al
total 14
drwx------+ 1 davidl None 0 Aug 8 19:04 .
drwxrwx---+ 1 SYSTEM SYSTEM 0 Aug 8 18:33 ..
-rw-------+ 1 davidl None 94 Aug 8 19:04 config
-rw-------+ 1 davidl None 1692 Aug 8 19:02 key.pem
-rw-------+ 1 davidl None 187 Aug 8 19:02 known_hosts
Примечание. Я проверил, что это монтирование NTFS, а не FAT32.
Как мне проще всего это сделать, кроме необходимости открывать терминал cygwin и запускать скрипт вручную?
.\bash.exe -l /home/davidl/deploy-dev.sh
? - person matzeri   schedule 08.08.2018.\bash.exe -c "whoami"
, я получаю тот же результат, что иwhoami
из терминала cygwin. Но я предполагаю, что в профиле есть что-то, что ему нужно. И я до сих пор не понимаю, почему запуститьrsync.exe
из PowerShell было так сложно. Но в любом случае это отличное решение. - person dsl101   schedule 09.08.2018