czwartek, 16 stycznia 2020

Kopiowanie plików poprzez SSH czyli SCP

Oczywiście nie pamiętam składni, a wszystko chcę mieć w jednym miejscu. Po kilku więc szukaniach w necie postanowiłem napisać w swoim miejscu.

Kopiowanie pliku plik.txt z lokalnego hosta na zdalny do katalogu /home/john_doe/other_files:

scp plik.txt john_doe@remote_host.com:other_files

Kopiowanie plików plik1.txt i plik2.txt z lokalnego hosta na zdalny do katalogu /home/john_doe/other_files:

scp plik1.txt plik2.txt john_doe@remote_host.com:other_files

Kopiowanie pliku plik.txt z lokalnego hosta na zdalny do katalogu /home/john_doe/other_files poprzez ssh skonfigurowane na porcie 20021:

scp -P 20021 plik.txt john_doe@remote_host.com:other_files

Kopiowanie pliku /archiw/plik.txt ze zdalnego hosta na lokalny do katalogu /home/other_files:

scp user@remote_host.com:/archiw/plik.txt /home/other_files

Kopiowanie kilku plików ze zdalnego hosta na lokalny do katalogu obecnego:

scp user@remote_host.com:/archiw/{arch1.zip, arch2.zip, arch3.zip} .

środa, 15 stycznia 2020

Utworzenie z konsoli nowego użytkownika Devise w Rails

Niezmiennie zapominam :-)
# Devise
user = User.new(email: 'test@example.com', 
                password: 'password', 
                password_confirmation: 'password')
user.save

Udostępnienie "gołego" pliku przez Google Drive

Dobry skądinąd Google Drive Ma bardzo denerwującą funkcję. Otóż jeśli komuś udostępniasz plik, zwykły plik tekstowy, to osoba otrzymująca link otwiera wcale nie ów plik tekstowy, tylko cały interfejs googlowy. Dopiero w tym interfejsie można sobie plik pobrać. Wkurzające. Szczególnie jeśli chcesz wstawić linki do pobrania na swojej stronie.

Jest jednak na to sposób.

Krótka analiza otrzymanego linka google zaraz po jego udostępnieniu

https://drive.google.com/file/d/1A0PjiDcAt0JUTgScY8hCy56FL6vm-gKJ/view?usp=sharing
W tym linku interesuje nas tylko sam id pliku, a jest nim, w tym przypadku 1A0PjiDcAt0JUTgScY8hCy56FL6vm-gKJ

Wycinamy sobie ten id.

Tutaj jest link do "obierania" interfejsu:

http://drive.google.com/uc?export=view&id=

Wystarczy na końcu dokleić wyekstrahowanyid pliku, co w całości da:

https://drive.google.com/open?id=1A0PjiDcAt0JUTgScY8hCy56FL6vm-gKJ

Ta dam! Mamy "goły" plik.

Całość przeczytałem na https://www.lmeservices.com/share-google-drive-files-via-url/

Wyszukiwanie zawartości w plikach Linux

Zapominam składnię, więc tu sobie składam przykłady.

grep -iRl "your-text-to-find" ./

I przełączniki:

  • -i - ignorowanie wielkości liter
  • -R - szukanie w podkatalogach (recursively search)
  • -l - pokazuj nazwy plików zamiast znalezionych fragmentów tekstów

Parametry:

  • ./ - gdzie ma szukać (w tym przypadku w obecnym katalogu)

Inne przydatne przełączniki:

  • -n - pokazuj numer linii. Wyłącz wtedy opcję -l (tylko nazwy plików) bo nic nie zobaczysz :-)
  • -w - szukaj tylko jako pełny wyraz (whole word only)

I inne przykładowe zapytanie

Wyszukanie ciągu "debugId" we wszystkich plikach z rozszeniem `js` w aktualnym katalogu, w ukrytym podkatalogu `.next`


grep -R 'debugId' ./.next/**/*.js

I wstawka od AI:
**: Jest to wzorzec używany przez bash lub inną powłokę obsługującą “rozszerzenie globbing” (np. w przypadku włączenia opcji globstar w bash lub domyślnie w zsh). Symbolizuje dowolną ilość poziomów katalogów, w tym katalog nadrzędny. W praktyce oznacza: “przeszukaj wszystkie katalogi i ich podkatalogi”.

wtorek, 14 stycznia 2020

Hook do automatycznego deploy'u po pushu do repozytorium zdalnego

Założenia:

  • masz lokalne repo z poprawnie skonfigurowanym remote origin (pisałem o tym m.in. w artykule o zainicjowaniu danymi zdalnego repo)
  • masz zdalny serwer na którym znajduje się origin (tzw. "bare" np. w katalogu /srv/git/my_app.git)
  • na tym samym hoście, na którym znajduje się "bare" repo, zdeployowana jest aplikacja, gdzie kod znajduje się w katalogu /var/www/my_app/code
  • chcesz aby po lokalnym git push origin master i zaktualizowaniu się repozytorium zdalnym, wysłane zmiany w kodzie zostały automatycznie zaciągnięte do aplikacji

Krok 1

W katalogu /srv/git/my_app.git/hooks tworzymy plik o nazwie post-receive

Krok 2

W utworzonym właśnie pliku post-receive umieszczamy taką zawartość:
#!/bin/sh

unset $(git rev-parse --local-env-vars)
cd /var/www/my_app/code
git pull
touch tmp/restart.txt

Krok 3

Plik post-receive czynimy wykonywalnym, np.tak:
chmod 755 post-receive

No i właściwie od tej chwili po twoim git push origin master możesz cieszyć się autodeployem. Całość pomysłu zaciągnąłem z https://stackoverflow.com/questions/5769568/how-to-set-up-a-git-hook-so-that-after-pushing-to-ssh-peterfoo-com-bar-com

poniedziałek, 13 stycznia 2020

Jak pokazać wielkość katalogu w systemie Linux

Wyświetlając katalogi tylko z zagłębienia pierwszego poziomu. Zlicza wszystkie poziomy! Właśnie tak:

du -h --max-depth=1

Można też to posortować:

du -h --max-depth=1 | sort -h
Opcja -h pokazuje z liczbami dogodnymi do czytania dla człowieka.

Znajdowanie pliku w systemie Linux przy pomocy komendy find

Zawsze oczywiście zapominam składnię, wiec właśnie zapisuję.

wyszukaj w katalogu, w którym się aktualnie znajduję, w nazwie pliku, bądź katalogu słówko "jmeter":

find . -name '*jmeter*'

To samo tylko dla plików:

find . -name '*jmeter*' -type f

To samo tylko dla plików nie kończących się na "png":

find . -name '*jmeter*' -type f -not -name '*png'

To samo tylko dla maksymalnego zagłębienia się w katalog drugiego poziomu:":

find . -name '*jmeter*' -type f -not -name '*png' -maxdepth 2

Pokaż wszystkie katalogi wewnątrz folderu bierzącego

find . -type d

Znajdź pliki, które były edytowane mniej niż 10 minut temu

find . -type f -mmin -10

Znajdź pliki, które były edytowane więcej niż 10 minut temu

find . -type f -mmin +10

Znajdź pliki, które były edytowane więcej niż minutę temu, ale mniej niż 10 minut temu

find . -type f -mmin +1 -mmin -10

Znajdź pliki, które były edytowane mniej niż 20 dni temu

find . -type f -mtime -20

Znadź pliki, które są większe niż 5 MB

find . -size 5M

Znajdź puste pliki

find . -empty

Znajdź pliki, które mają uprawnienia 775

find . -perm 775

Znajdź wszystkie obrazki .png w bieżacym katalogu i przypomocy komendy chown zmień właściciela na test_user i grupę na test_group
Nawiasy klamrowe {} są placeholderem imitującym plik, a znak plus na końcu + mowi, że to koniec komend.

find . -type f -name "*.png" -exec chown test_user:test_group {} +

Znajdź wszystkie obrazki jpg tylko w bieżącym katalogu (nie w podkatalogach czyli użyjemy -maxdepth 1 gdzie jedynka to ilość w głąb katalogów) i usuń je. To zagłebienie w katalogi jest ważne, gdyż domyślnie komenda find idzie do ostatniego katalogu wgłąb.

find . -type f -name "*.jpg" -maxdepth 1 -exec rm {} +

Uwaga! Wszędzie ciapki są ważne. Ciapki można zastapic cudzysłowami i vice versa. Ważne tylko, aby stosować je konsekwentnie.