Записки Краснодарского Программиста

Интересы: GNU/Linux, BASH, Ruby, Ruby on Rails, SCRUM, создание сайтов, продвижение сайтов, программирование, DevOps, серверное и системное администрирование.

Команды Vim

Записи про Ruby — тут
Записи про Vim — тут
Записи про Bash и Linux
Горячие клавиши — тут

City: Краснодар
E-mail:

Ctrl + ↑ Позднее

install for me


sudo apt-get install ranger mc mutt evolution geany nano keepassx imagemagick whois wget ruby sinatra firefox lynx w3m pwgen liferea gimp virtualbox vlc youtube-dl shutter klavaro ktouch libreoffice pindgin gnumeric git htop unetbootin nemo xmlstarlet screen laby freeplane fbreader vim tree at kazam traceroute rake anki pass dia tmux guake

+PDF-Shuffler + HPLIP + printer-driver + telegram + heroku + google chrome + firefox developer edition + viber

Удалить EXITF из изображения


Посмотреть данные: $ exiftool image.jpeg
Стереть данные: $ exiftool -all= image.jpeg
Стереть из всех файлов в каталоге: $ exiftool -all= *
Стереть из всех jpg в каталоге: $ exiftool -all= *.jpg

2017   bash   exiftool   EXITF   linux

SSH, SCP: ssh-keygen: избавляемся от ошибки Received disconnect from Received disconnect from Too many authentication failures for

Ранее, было описано как настроить доступ к серверу по связке ключей через ssh-keygen: http://krdprog.ru/?go=all/ssh-keygen-avtorizaciya-k-ssh-bez-vvoda-parolya-po-pare-klyuchey/

Вопрос: Почему возникает ошибка Received disconnect from Received disconnect from Too many authentication failures for при подключении к серверу?
Ответ: В файл конфигурации ~/.ssh добавлено множество ключей и серверу это не нравится, и он блокирует доступ.

Как решить:
В файле ~/.ssh/config для хостов принудительно указать файлы сертификатов в строке IdentityFile


Host mysite
IdentityFile ~/.ssh/mysite_key.pub
HostName 00.000.00.00
User siteadmin

При наличии связки ключей ssh-keygen, чтобы подключиться по ssh не по связке ключей, а по паролю, надо вызывать ssh следующим образом:


ssh -o 'IdentitiesOnly=yes'

2017   scp   ssh   ssh-keygen

Яндекс.XML не работает с адресами IPv6. Как отключить на хостинге IPv6, чтобы работать с Яндекс.XML

Если работа приложения связана с Яндекс.XML, а на VPS работает IPv6, то придётся его отключить и включить IPv4.

Вот инструкция:


1.Выполните команду
echo net.ipv6.conf.all.disable_ipv6=1 > /etc/sysctl.d/disableipv6.conf

2.В файле /etc/hosts закомментируйте все строки, относящиеся к IPv6
# The following lines are desirable for IPv6 capable hosts
#::1 ip6-localhost ip6-loopback
#fe00::0 ip6-localnet
#ff00::0 ip6-mcastprefix
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters

3. Добавьте или измените строки в /etc/ssh/ssh_config
AddressFamily inet

4. В /etc/avahi/avahi-daemon.conf 
use-ipv6=no

5. В /etc/exim4/update-exim4.conf
disable_ipv6 = true

6. Перезагрузить и убедиться, что интерфейс не имеет адреса IPv6
ifconfig
- после перезагрузки не должно быть строки с IPv6 адресом. 

7. Проверить нет ли подключений и прослушиваемых портов по IPv6
netstat --all | grep -E "tcp6|udp6"

Взято отсюда: http://forum.ispsystem.ru/showthread.php?24588-%D0%9A%D0%B0%D0%BA-%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C-IPv6

Опробовано на Debian 7.0 (Wheezy)

2017   backup   bash   linux   tar

Добавить, блокировать, удалить пользователя в *NIX (Debian)

С правами root. В примере пользователь krdprog

Добавить нового пользователя. Система запросит пароль (ввести 2 раза):


adduser krdprog

Блокировать пользователя:


passwd --lock krdprog

Удалить пользователя и всю его домашнюю директорию:


deluser --remove-home krdprog

Сменить пароль пользователя:


passwd

2017   adduser   debian   deluser   linux   passwd

sudo apt-get install laby

Программа для тренировки и обучения программированию.

Определение ссылок на странице, их количества и типа через bash-скрипт

В справочнике по Linux нашёл описание UNIX-утилиты dog, но потом обнаружилось, что её убрали. Пока я её не нашёл, а нашёл замену. Работу средствами консольного браузера lynx.

Итак, напишем скрипт поиска внутренних ссылок на странице сайта (links.on.page.sh):


#!/bin/bash
#=======================================================================
# Скрипт поиска внутренних ссылок на странице сайта
#=======================================================================
URL="$1" ; # адрес страницы заданный через аргумент к скрипту

# уникальные внутренние ссылки:
GiveMeListUrlOnPage () {
lynx -dump -nonumbers -listonly $URL | grep $URL | sort | uniq ;
}

GiveMeListUrlOnPage ;

exit 0

Запускаем скрипт, поиск уникальных внутренних ссылок на странице сайта:


$ sh links.on.page.sh krdprog.ru

если надо сохранить в файл:
$ sh links.on.page.sh krdprog.ru > url.txt

если надо показать количество ссылок, то так:
$ sh links.on.page.sh krdprog.ru | wc -l

Можно определять также скрытые и внешние ссылки.

Как использовать?

Можно, дописать, например, определитель структуры сайта, или скрипт подготовки sitemap.xml, или в связке со скриптом достающим из ТОП-10 Яндекса адреса сайтов по конкретному ключевому слову, создать анализатор сайтов в ТОП Яндекса по словам (покажет для каждого сайта сколько ссылок на странице), а также разработать анализатор перелинковки сайтов.

2017   bash   dog   linux   lynx   seo

ssh-keygen — авторизация по ssh без ввода пароля (по паре ключей RSA)


1. Генерация пары ключей:
ssh-keygen -b 2048 -t rsa -f ~/.ssh/sitename_key -C "Key for site"

2. Разложим ключи по местам:
Публичный ключ sitename_key.pub копируем на удалённый сервер в домашнем каталоге создав каталог ~/.ssh и меняя название файла на authorized_keys

# выставим права на удалённом сервере:
~$ chmod 700 .ssh/
~$ chmod 600 .ssh/authorized_keys

3. Делаем короткую запись доступа к серверу (на локальной машине):
nano ~/.ssh/config

Содержимое файла ~/.ssh/config:

Host sitename
IdentityFile ~/.ssh/sitename_key.pub
HostName 11.111.111.11
User usernameftp

# Тут мы сделали короткую запись, чтобы не вводить ssh usernameftp@11.111.111.11, а набирать просто ssh sitename

Пробуем:
$ ssh sitename

http://wiki.dieg.info/ssh
http://rus-linux.net/MyLDP/sec/generiruem-kluchi-ssh.html
https://vds-admin.ru/ssh/ssh-autentifikatsiya-po-klyucham-ispolzovanie-programm-ssh-keygen-i-ssh-agent
https://www.dmosk.ru/miniinstruktions.php?mini=scp-without-password

Можно для копирования ключа использовать команду ssh-copy-id usrername@servername (попробую и при удачном опыте, допишу заметку).

2017   bash   linux   ssh   ssh-keygen

screen


screen - запустить скрин
screen -S taskmane -t taskname - запустить скрин с именем taskname

screen -r taskname - открыть скрин с именем taskname
screen -x taskname - подключиться к скрину запущенному в другом терминале

Ctrl+a+d - свернуть скрин
ctrl+d - выйти из screen

screen -list - список активных скринов

Настроим screen. В файле ~/.screenrc надо добавить:


hardstatus on
hardstatus alwayslastline
hardstatus string "%w"
#shell /bin/bash
startup_message off

Упростим работу, создадим алиасы (в ~/.bashrc):


alias screen1='screen -S 1 -t 1'
alias screen2='screen -S 2 -t 2'
alias screen3='screen -S 3 -t 3'
alias screen4='screen -S 4 -t 4'
alias screen5='screen -S 5 -t 5'

alias screenr1='screen -r 1'
alias screenr2='screen -r 2'
alias screenr3='screen -r 3'
alias screenr4='screen -r 4'
alias screenr5='screen -r 5'

Теперь запускать скрины можно по команде screen1
Сворачивать по: ctrl+a+d
Разворачивать по: screenr1
и т.п. для каждого номера

https://admins.su/kak-polzovatsya-utilitoj-screen-v-linux/
https://wikival.bmstu.ru/doku.php?id=%D0%BF%D0%B0%D0%BA%D0%B5%D1%82_screen

2017   bash   linux   screen   терминал
2017   bash   grep   linux

Наброски скрипта с применением case


#!/bin/bash

# обработка фотографий в jpg
case "$1" in
     jpg)
          echo "Ок. Это jpg" ;
          ;;
     jpeg|JPEG|JPG)
          echo "Переименуем в jpg" ;
          ;;
     png|PNG)
          echo "Конвертируем png в jpg" ;
          ;;
     gif|GIF)
          echo "Конвертируем gif в jpg" ;
          ;; 
     *)
          echo "Этот тип файла не поддерживается операцией" ; # все другие форматы
          ;;
esac

exit 0

2017   bash   case   linux   наброски
2017   bash   linux   функция

Cоздание каталога для log-файлов


#!/bin/bash

# создание каталога для log-файлов	
MkdirLog () {
	if ! [ -d "./log" ] ; then
		mkdir ./log ; # каталог ./log
	fi ;

	if ! [ -d "./log/$(date +%F)" ] ; then
		mkdir ./log/$(date +%F) ; # каталог с текущей датой внутри каталога ./log
	fi ;
	
	LogDir="./log/$(date +%F)" ;
}

MkdirLog ;

exit 0

Проверка наличия файла из скрипта bash


YesOrNotFileFind () {
	if ! [ -f "$1" ] ; then
		echo "Файл $1 не найден" ;
	else
		echo "Файл $1 найден" ;
	fi
}

# передадим в аргументе функции имя файла для проверки на наличие
YesOrNotFileFind "./list" ;
YesOrNotFileFind "./my.config" ;


-e 	Файл существует
-f 	Файл существует и это обычный файл
-r 	Файл существует и он доступен для чтения
-w 	Файл существует и он доступен для записи
-x 	Файл существует и он исполняемый
-L 	Файл существует и это символьная ссылка
-S 	Файл существует и это сокет
-d 	Директория существует

2017   bash   linux   test
2017   bash   cat   linux   wc

Удалить N верхних строк в файле

Пример: удалить 10 первых строк из файла:


sed '1,10d' test.log > test.tmp.log && mv test.tmp.log test.log

или с переменной

HowManyLines=10 ;

tail -n $((`wc -l test.log | awk '{print $1}'`-$HowManyLines)) test.log > test.tmp.log && mv test.tmp.log test.log

2017   awk   bash   linux   sed

Вывести конкретные строки из файла (bash)

Вывести с 1 по 6 строку из файла test.txt


sed -n 1,6p test.txt

Вывести с 4 по 8 строку + строку номер 11 из файла test.txt


sed -n -e 4,8p -e 11p test.txt

Вывести строку номер 5


head -n 5 test.txt | tail -n 1
или
sed -n 5p test.txt

ИСКЛЮЧИТЬ ИЗ ВЫВОДА СТРОКИ (пример: исключим 1 и 2 строку из test.txt):


sed '1,2d' test.txt

2017   bash   head   linux   sed   tail
2017   bash   linux   shuf

Переслать 10 Гигов через консоль


curl --upload-file test.txt transfer.sh/test.txt

https://transfer.sh/

Для удобства можно создать функцию в .bashrc


$ nano .bashrc

Затем добавить в .bashrc:


transfer() { if [ $# -eq 0 ]; then echo -e "No arguments specified. Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"; return 1; fi 
tmpfile=$( mktemp -t transferXXX ); if tty -s; then basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9._-]/-/g'); curl --progress-bar --upload-file "$1" "https://transfer.sh/$basefile" >> $tmpfile; else curl --progress-bar --upload-file "-" "https://transfer.sh/$1" >> $tmpfile ; fi; cat $tmpfile; rm -f $tmpfile; } 

Обновить bash:


$ bash

И можно загружать:


$ transfer test.zip

2017   bash   linux   transfer   ссылка
Ctrl + ↓ Ранее