Shell Script для загрузки файла в тот же подкаталог на удаленном сервере
Очень распространенная задача для веб-разработчика - выгрузка одного файла из подкаталога вашего блока разработки в тот же подкаталог на удаленном сервере. К сожалению, это всегда заканчивается раздражающим ручным процессом, включающим переключение каталогов на обоих серверах, и тратит много времени.
Итак, я взял на себя ответственность написать скрипт оболочки, чтобы автоматизировать это для меня, используя scp для безопасного копирования файлов. (Важное примечание: ftp ужасно небезопасен, вместо этого используйте WinSCP)
Основная проблема, которую нужно было решить, заключалась в том, что моя установка WordPress на моей машине для разработки имела другую базовую директорию, чем установка на моем сервере. На моей машине разработки это / var / www, а на моем сервере это что-то вроде / var / www / howtogeek / docs /. Я решил просто переместить их в переменные в начале скрипта, например так:
[email protected]
RDIR = / вар / WWW / howtogeek / документы
LDIR = "\ / вар \ / WWW"
Обратите внимание, что локальный каталог (LDIR) в сценарии имеет \ перед каждым / в пути. Это потому, что мы собираемся передать это в команду sed позже в скрипте, поэтому мы должны экранировать эти значения. Я уверен, что есть другой способ обойти это, но я не знаю об этом.
Далее я настроил автоматические логины ssh. Для этого вам нужно сначала запустить утилиту ssh keygen следующим образом:
ssh-keygen -t rsa
Затем вам нужно скопировать файл ~ / .ssh / id_rsa.pub в файл ~ / .ssh / authorized_keys на удаленном сервере. Если каталог ~ / .ssh уже создан на удаленном сервере (возможно, потребуется проверить), вы можете выполнить эту команду, чтобы скопировать ключи:
cat ~ / .ssh / id_rsa.pub | ssh user @ hostname 'cat >> .ssh / authorized_keys'
Теперь у нас есть автоматические ssh логины, которые позволят использовать утилиту scp без пароля. Теперь давайте посмотрим на команду scp, которую мы будем использовать в скрипте:
scp $ 1 $ SSHSERVER: $ RDIR'pwd | sed «s / $ LDIR //» '/' echo $ 1 | sed 's /.*\/// "
$ 1 - это параметр, который вы передадите в скрипт для имени файла, которое вы пытаетесь загрузить. $ SSHSERVER и $ RDIR - это переменные, которые мы установим в начале скрипта для установки user @ hostname и предыдущего удаленного пути.
Первый блок, который начинается с pwd | sed, берет текущий путь к каталогу и удаляет предыдущую часть пути, которая не соответствует удаленному серверу, но оставляет остальную часть пути. Например, если вы находились в / var / www / wp-content / при запуске команды, блок sed удалил бы / var / www на основе нашей переменной LDIR, но оставил бы / wp-content / ее часть.
Второй блок просто убирает весь предыдущий путь из имени файла, переданного в скрипт, так что вы просто получаете имя файла.
Например, если вы назвали скрипт up.sh и запустили его из вашего локального каталога / var / www / wp-content / plugins / в файле:
up.sh myplugin.php
Это было бы расширено оболочкой следующим образом:
scp myplugin.php [email protected]: /var/www/howtogeek/docs/wp-content/plugins/myplugin.php
Вместо того, чтобы пытаться создать свой собственный файл сценария на основе статьи, я предоставил его для загрузки. Таким образом, не будет никаких проблем с неработающими специальными символами ... и да, я использовал скрипт для загрузки самого себя =)
Скачать geek-uploader.sh
Просто поместите это где-нибудь на своем пути и назовите как хотите. Я переименовал мой в «up», поэтому я могу просто напечатать «up filename.txt» для загрузки. Также не забудьте открыть его и изменить переменные в начале скрипта, чтобы они соответствовали вашей среде..
Этот скрипт должен работать на чем угодно с оболочкой * nix и утилитой scp. Я использую Ubuntu, но он должен работать на Solaris, OS X или даже Windows с установленным Cygwin.