29Jun
Bardzo typowym zadaniem dla programisty internetowego jest przesyłanie pojedynczego pliku z podkatalogu w twoim polu programistycznym 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.
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 niepewna, 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ś takiego jak /var/www/howtogeek/docs/.Postanowiłem po prostu przenieść te zmienne na początku skryptu, na przykład:
[email protected]
RDIR = /var/www/howtogeek/ docs
LDIR = '\ / var \ / www'
Zauważ, że lokalny katalog( LDIR) w skrypcie ma \ 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 ~ /.ssh/ pliku authorized_keys na serwerze zdalnym. Jeśli katalog ~ /. ssh został 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 @ nazwa hosta "cat & gt; & gt;.ssh / authorized_keys '
Teraz mamy zautomatyzowane logowanie ssh, które umożliwi korzystanie z narzędzia scp bez hasła. Teraz spójrzmy na polecenie scp, którego użyjemy w skrypcie:
scp $ 1 $ SSHSERVER: $ RDIR`pwd | sed "s / ${ LDIR} //" `/` echo $ 1 | sed 's /.* \ /// '`
$ 1 jest parametrem, który zostanie przekazany skryptowi dla 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 rozpoczynający się od pwd | sed pobiera bieżącą ścieżkę 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 / kiedy uruchomiłeś komendę, blok sed rozebrałby /var/ www na podstawie naszej zmiennej LDIR, ale opuściłby / wp-content / część z niego.
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 /plugins/ /plugins/ na /var/www/ w pliku:
up.sh myplugin.php
Zostałby rozszerzony przez powłokę w następujący sposób:
scpmyplugin.php [email protected]: /var/www/howtogeek/docs/ wp-content /plugins/ myplugin.php
Zamiast próbować stworzyć 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 do przesłania się =)
Pobierz geek-uploader.sh
Po prostu umieść go gdzieś na swojej ścieżce i nadaj mu dowolną nazwę.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 wszystkim 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.