ssh-copy-id логин без пароля по ssh

Для того, чтобы подключаться к серверу без пароля можно воспользоваться командой ssh-copy-id, которая копирует публичный ключ в файл $HOME/.ssh/authorized_keys на сервер, к которому вы планируете подключаться.

Ключ можно предварительно сгениерировать с помощью команды ssh-keygen например, так:

# ssh-keygen -t rsa -b 4096 -C "your@email.com"

Пример использования команды ssh-copy-id ниже:

# ssh-copy-id -i /root/.ssh/id_rsa.pub user@hostOrIp
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@hostOrIp's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'user@hostOrIp'"
and check to make sure that only the key(s) you wanted were added.

Вместо user – поставляете имя пользователя, который будет заходить без пароля, а вместо hostOrIp хост или IP-адрес целевого сервера

Приостановить или заморозить процесс kill

В случае, если необходимо приостановить или заморозить какой-то процесс, а потом продолжить его работу помогут команды ps и kill

С помощью ps мы можем узнать PID процесса:

# ps auxwww |grep -v grep |grep -i 'process_name'

Команда должна вернуть запись содержащую такие колонки:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

Далее приостанавливаем подходящий процесс командой *:

# kill -STOP PID

Чтобы продолжить остановленный процесс необходимо выполнить команду *:

# kill -CONT PID

* Вместо PID нужно подставить цифровой идентификатор процесса.

Подсчитать количество файлов в папке

Чтобы подсчитать количество файлов в папке с огромным количеством файлов можно выполнить команды:

# cd /path/to/folder_with_huge_number_of_files1
# ls -f | wc -l

или для любитерей Perl есть еще такой способ:

# cd /path/to/folder_with_huge_number_of_files2
# perl -e 'opendir D, "."; @files = readdir D; closedir D; print scalar(@files)."\n"'

Linux bash: переменная окружения TMOUT автоматический Log Out пользователя

Чтобы реализовать автоматический выход из сессии Linux bash через 5 минут отсутсвия активности необходимо добавить такие настройки:

# set a 5 min timeout policy for bash shell
TMOUT=300
readonly TMOUT
export TMOUT

в файл ~/.bash_profile или /etc/profile

Чтобы отключить таймаут необходимо выполнить команду

# export TMOUT=0

или

# unset TMOUT

Учтите тот факт, что readonly переменная может быть отключена только админ пользователем root в глобальном файле конфигруации bash /etc/profile или пользовательском файле настройки bash ~/.bash_profile.

Linux bash: конвертировать строку разделенную проблеми в массив

Недавно возникла необходимость конвертировать первый параметр, который передавался bash скрипту из строки разделенной пробелами в массив.

Это можно сделать так:

#/bin/bash

declare -a PARAMS="( $1 )"
# нумерация элементов массива начинается с индекса со значением 0
PARAM1="${PARAMS[0]}"
PARAM2="${PARAMS[1]}"

Linux bash: еще один вариант работы с массивом и циклом for

Я уже писал раньше об работе с массивом и циклом for в shell скриптах.
Еще один возможный варинт синтаксиса, удобный для запоминания программистами, которые раньше писали на C-подобных языках, представлен ниже:

#!/usr/bin/env sh

arr=('foo' 'bar' 'baz')

for ((i=0; i < ${#arr[@]}; i++)); do
        echo "arr[${i}]: ${arr[i]}"
done

В примере переменная arr содержит массив значений, значения которого перебираются в цикле for

Linux bash: удалить первый символ со значения переменной

Недавно возникла задача в Linux bash скрипте удалить первый символ со значения переменной.

Я уже ранее писал о том, как можно удалить удалить последний символ со значения переменной в Linux bash.

Удалить первый символ значения можно так:

#!/bin/bash

str1="foo bar"
echo "String1: ${str1}"

str2=${str1:1:${#str1}}
echo "String2: ${str2}"

Пример использования утилит grep, cut, uniq и sort для получения списка уникальных IP адресов, которые посещали определенный URL

Если возникает необходимость получить список уникальных IP адресов, которые посещали определенный URL из логов веб сервера Apache, то это можно сделать таким способом:

# grep -rn "some/string" ./access_lo* |cut -d: -f3 |cut -d- -f1 |uniq |sort

Как заменить строки в файле с помощью sed

Если необходимо заменить все вхождения строки search на replace можно это сделать командой:

# sed 's/search/replace/g' file1.txt > file2.txt

где файл file1.txt, в котором будет производиться поиск строк search, а file2.txt будет содержать replace вместо всех найденых вхождений

Если в шаблоне поиска и/или замены необходимо заменять слеш /, то его нужно экранировать с помощью обратного слеша так: \/

Если необходимо найти все файлы в папке и сделать замену не выполняя бекап можно воспользоваться оцией sed -i в комбинации с find, например так:

# find /home/taras/test_sed -type f -exec sed -i 's/search/replace/g' {} \;

Более детальную информцию можно прочитать в документации

# man sed

MySQL shell script проверить существует ли база данных

С днем системного администратора всех, кто имеет к этой профессии хоть какое-то отношение.

Время от времени сталкиваюсь с необходимостью выяснить сущесвует ли в MySQL база данных с определенным именем.
Написал небольшой shell скрипт, чтобы делать подобную проверку.
Может быть он будет вам тоже полезен:

Файл ./check-mysql-database-exists.sh

#!/usr/bin/env bash

if [ -z $1 ];
then
    echo "Usage: $0 'database name'"
    exit 1
fi

DB_NAME=$1

if [ ! -z "`mysql -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$DB_NAME'" 2>&1`" ];
then
    echo "DATABASE $DB_NAME ALREADY EXISTS"                                                                                                                                                                      
else
    echo "DATABASE $DB_NAME DOES NOT EXIST"                                                                                                                                                                      
fi

Назначим права, чтобы скрипт стал исполняемым:

# chmod -v 755 ./check-mysql-database-exists.sh

Запускаем проверку базы database_name_to_check так:

# ./check-mysql-database-exists.sh database_name_to_check

И еще одно: с сегодняшнего дня основным адресом блога будет http://www.linuxweb.net.ua/.
Все статьи будут публиковаться на впервую очередь на нем, а потом уже будет производиться кросс пост в мой LiveJournal http://plmw.livejournal.com/.

Linux bash: пример работы с массивом и цикл for

Время от времени приходится в Linux bash shell скрпитах использовать массивы и циклы for.
Может быть кому-то тоже будет полезно это.

#!/usr/bin/env bash

dirs=('tmp' 'cache' 'logs')

for j in ${dirs[@]} 
do
    echo $j
done

В примере переменная dirs содержит массив значений, значения которого перебираются в цикле for

rpm посмотреть список зависимоестей пакета

В rpm-based Linux системах иногда бывает полезно посмотреть список зависимостей для пакета.

Это можно сделать командой rpm -qR имя пакета.

Например:

# rpm -qR htop

libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libncursesw.so.5()(64bit)
libtinfo.so.5()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1

yum deplist список зависимостей пакета

Чтобы посмотреть список зависимостей для пакета в rpm-based Linux Red Hat, CentOS, Fedora и других дистрибутивах можно выполнить такие команды:

1. Получить все пакеты, в названии, которых есть “office”

# rpm -qa |grep -i "office"

libreoffice-impress-3.6.6.2-5.fc18.x86_64
libreoffice-calc-3.6.6.2-5.fc18.x86_64
libreoffice-writer-3.6.6.2-5.fc18.x86_64
libreoffice-core-3.6.6.2-5.fc18.x86_64
libreoffice-graphicfilter-3.6.6.2-5.fc18.x86_64
libreoffice-kde-3.6.6.2-5.fc18.x86_64
libreoffice-pdfimport-3.6.6.2-5.fc18.x86_64
libreoffice-math-3.6.6.2-5.fc18.x86_64
libreoffice-xsltfilter-3.6.6.2-5.fc18.x86_64
libreoffice-ure-3.6.6.2-5.fc18.x86_64
libreoffice-draw-3.6.6.2-5.fc18.x86_64
libreoffice-opensymbol-fonts-3.6.6.2-5.fc18.noarch
libreoffice-presenter-screen-3.6.6.2-5.fc18.x86_64

2. Получить список зависимостей для пакета libreoffice-draw-3.6.6.2-5.fc18.x86_64

# yum deplist libreoffice-draw-3.6.6.2-5.fc18.x86_64

Loaded plugins: auto-update-debuginfo, langpacks, presto, refresh-packagekit
Unable to send message to PackageKit

package: libreoffice-draw.x86_64 1:3.6.6.2-5.fc18
dependency: /bin/sh
provider: bash.x86_64 4.2.45-1.fc18
dependency: libreoffice-core = 1:3.6.6.2-5.fc18
provider: libreoffice-core.x86_64 1:3.6.6.2-5.fc18
dependency: libreoffice-graphicfilter = 1:3.6.6.2-5.fc18
provider: libreoffice-graphicfilter.x86_64 1:3.6.6.2-5.fc18
dependency: libreoffice-pdfimport = 1:3.6.6.2-5.fc18
provider: libreoffice-pdfimport.x86_64 1:3.6.6.2-5.fc18
dependency: libreoffice-ure = 1:3.6.6.2-5.fc18
provider: libreoffice-ure.x86_64 1:3.6.6.2-5.fc18