Główna » jak » Skrypt powłoki do przesłania pliku do tego samego podkatalogu na serwerze zdalnym

    Skrypt powłoki do przesłania pliku do tego samego podkatalogu na serwerze zdalnym

    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 irytującym ręcznym procesem obejmującym przełączanie katalogów na obu serwerach i marnowanie dużej ilości 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 dodatkowa: 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 na to 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 prześlesz skryptowi nazwy pliku, który chcesz 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 usuwałby / var / www w oparciu o naszą zmienną LDIR, ale pozostawił / wp-content / part of it.

    Drugi blok upewnia się, że usunął całą poprzednią ścieżkę poza nazwą pliku przekazaną do skryptu, więc po prostu dostajesz 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 do przesłania się =)

    Pobierz geek-uploader.sh

    Po prostu umieść go gdzieś na swojej drodze i nazwij to, co chcesz. Zmieniłem nazwę na "up", więc mogę po prostu napisać "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.