czwartek, 23 stycznia 2020
SFTP uruchamiane z linii poleceń bez hasła w Linux
środa, 22 stycznia 2020
Zmienne w bash'u w Linuxie
Najprostsze użycie zmiennej:
#!/bin/bash
STR="Hello World!"
echo $STR
Na konsoli na wypisze string "Hello World!".
Tu ciut więcej:
#!/bin/bash
FILENAME=/var/my-backup-$(date +%Y-%m-%d).tgz
tar -czf $FILENAME /home/me/
Zmienna $FILENAME
to string dynamiczny, w skład którego wchodzi data w formacie rok-miesiąc-dzień, np. 20019-12-31. Program tar zarchiwizuje nam w pliku /var/my-backup-2019-12-21.tgz
zawartość katalogu /home/me
I jeszcze króciutko o funkcjach i zmiennych lokalnych (local):
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
Tu zmienna $HELLO
przyjmuje najpierw wartość "hello", a po wykonaniu funkcji hello
zmienna $HELLO
zmienia wartość na "World".
zip i Linux
Składnia:
zip [options] zipfile list_of_files_with_spaces
Skompresuj plik filename.txt
do archiwum o nazwie myfile.zip
:
$ zip myfile filename.txt
Wyciągnij z archiwum:
$ unzip myfile.zip
Uprzednio zarchiwizowany plik filename.txt
zostanie wydobyty z archiwum.
Opcja -u
czyli aktualizacja pliku w archiwum
$ zip –u filename.zip file.txt
W tym przypadku zostanie zaktualizowany plik file.txt
w archiwum filename.zip
Opcja -m
czyli usunięcie pliku źródłowego po udanej kompresji archiwum:
$ zip –m filename.zip file.txt
Tu zostanie usunięty plik file.txt
Opcja -r
(recursively) czyli archiwizacja całego katalogu:
$ zip –r filename.zip directory_name
Tu zostanie skompresowany folder o nazwie directory_name
cron w Linuxie
$ crontab -l
Edycja zadań crontaba:
$ crontab -e
Znaczenie poszczególnych gwiazdek w pliku crontaba:
Czyli:
- pierwsza gwiazdka - minuta wykonywania zadania
- druga gwiazdka - godzina wykonywania zadania
- trzecia gwiazdka - dzień wykonywania zadania
- czwarta gwiazdka - jest odpowiednikiem miesiąca od 1 do 12 lub jan - dec (z angielska)
- no i piąta gwiazdka - jest dniem tygodnia, gdzie 0 i 7 to niedziela! Albo można zapisać z angielska (he he) od sun do sat
Tworzenie zakresów lub częstotliwości:
- */5 * * * * - wykonaj polecenie co pięć minut każdego dnia
- 0 13-15 * * * – wykonaj polecenie o 13:00, 14:00 i 15:00 każdego dnia
- 15 23 * * mon-fri – oznacza zadanie wykonywane codziennie od poniedziałku do piątku o godzinie 23:15
- 0 4 * * mon-fri/2 – uruchomi polecenie w każdy poniedziałek, środę i piątek o godzinie 4:00
No i w całości:
00 */12 * * * /home/wacek/scripts/rename_files.sh 2>&1
Czyli: co dwanaście godzin (z moich obserwacji o 12:00 i 24:00) wykonaj skrypt z katalogu użytkownika "wacek" i jego katalogu "scripts" plik wykonywalny o nazwie "rename_files.sh"
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
# 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)
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 plikupost-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
Plikpost-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
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.
wtorek, 7 stycznia 2020
* - (gwiazdka, asterix) czyli operator splat w Ruby
def my_method(*args)
args.each {|arg| puts arg}
end
a wywołanie:
my_method(:a, "ala ma kota", 1, 2, 3.14)
A tak przy okazji... splat ma sporo więcej możliwości.
Opisane fajnie tutaj: https://www.honeybadger.io/blog/ruby-splat-array-manipulation-destructuring/