Bardzo typowym zadaniem dla programisty internetowego jest przesyłanie pojedynczego pliku z podkatalogu w skrzynce programistycznej do tego samego podkatalogu na serwerze zdalnym. Niestety, zawsze kończy się to denerwującym ręcznym procesem obejmującym przełączanie katalogów na obu serwerach i marnuje dużo czasu.
Tak więc podjąłem się napisania skryptu powłoki, aby zautomatyzować to dla mnie, używając scp do bezpiecznego kopiowania plików. (Ważna uwaga: ftp jest strasznie niepewny, zamiast tego użyj WinSCP)
Głównym problemem do rozwiązania było to, że moja instalacja WordPressa na moim komputerze programującym ma inny katalog podstawowy niż instalacja na moim serwerze. Na mojej maszynie programistycznej jest to / var / www, a na moim serwerze jest coś podobnego do / var / www / howtogeek / docs /. Postanowiłem po prostu przenieść te zmienne na początku skryptu, tak jak poniżej:
[email protected]
RDIR = / var / www / howtogeek / docs
LDIR = "\ / var \ / www"
Zauważ, że lokalny katalog (LDIR) w skrypcie zawiera \ przed każdym / w ścieżce. Dzieje się tak dlatego, że zamierzamy przekazać to w poleceniu sed w dalszej części skryptu, więc musimy uciec od tych wartości. Jestem pewien, że jest w tym jakiś inny sposób, ale nie jestem tego świadomy.
Następnie konfiguruję automatyczne logowanie ssh. Aby to zrobić, musisz najpierw uruchomić narzędzie keygen ssh tak:
ssh-keygen -t rsa
Następnie musisz skopiować plik ~ / .ssh / id_rsa.pub do pliku ~ / .ssh / authorized_keys na serwerze zdalnym. Jeśli katalog ~ / .ssh jest już utworzony na serwerze zdalnym (może chcieć sprawdzić), możesz uruchomić to polecenie, aby skopiować klucze:
cat ~ / .ssh / id_rsa.pub | ssh użytkownik @ nazwahosta "cat >> .ssh / authorized_keys"
Teraz mamy zautomatyzowane logowanie ssh, które umożliwi korzystanie z narzędzia scp bez hasła. Teraz rzućmy okiem na polecenie scp, którego użyjemy w skrypcie:
scp $ 1 $ SSHSERVER: $ RDIR'pwd | sed "s / $ LDIR //" '/ "echo $ 1 | sed' s /.*\///"
1 $ to parametr, który przekazujesz skryptowi do nazwy pliku, który próbujesz przesłać. $ SSHSERVER i $ RDIR to zmienne, które ustawimy na początku skryptu, aby ustawić użytkownika @ hostname i poprzednią zdalną ścieżkę.
Pierwszy blok zaczynający się od pwd | sed pobiera bieżącą ścieżkę do katalogu i usuwa poprzednią część ścieżki, która nie jest zgodna z serwerem zdalnym, ale pozostawia resztę ścieżki. Na przykład, jeśli byłeś w / var / www / wp-content / po uruchomieniu polecenia, blok "sed" usunąłby / var / www w oparciu o naszą zmienną LDIR, ale pozostawiłby / wp-content / part of it .
Drugi blok upewnia się, że usunięto całą poprzednią ścieżkę poza nazwą pliku przekazaną do skryptu, więc po prostu otrzymujemy nazwę pliku.
Na przykład, jeśli nazwałeś skrypt up.sh i uruchomiłeś go z lokalnego / var / www / wp-content / plugins / katalogu na pliku:
up.sh myplugin.php
Zostałoby to rozszerzone przez powłokę w następujący sposób:
scp myplugin.php [email protected]: /var/www/howtogeek/docs/wp-content/plugins/myplugin.php
Zamiast próbować utworzyć własny plik skryptu na podstawie tego artykułu, udostępniłem go do pobrania. W ten sposób nie będzie żadnych problemów ze specjalnymi znakami, które nie działają ... i tak, użyłem skryptu, aby przesłać się =)
Pobierz geek-uploader.sh
Po prostu umieść go gdzieś na swojej ścieżce i nazwij to, co chcesz. Zmieniłem nazwę na "up", więc mogę po prostu wpisać "up filename.txt", aby przesłać. Pamiętaj też, aby go otworzyć i zmienić zmienne na początku skryptu, aby pasowały do twojego środowiska.
Ten skrypt powinien działać na wszystkich obiektach z powłoką * nix i narzędziem scp. Używam Ubuntu, ale powinno działać na systemie Solaris, OS X lub nawet Windows z zainstalowanym Cygwin.