Архив метки: Скрипты

🐧 Улучшение входа по SSH с помощью меню выбора сеанса Tmux на Linux

В этой статье мы покажем, как настроить меню выбора сеанса tmux, которое активируется при SSH-входе в удаленную Linux-систему.

В этом меню будут перечислены существующие сессии tmux и предложена возможность создания новой сессии.

Введение

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

Это особенно удобно при работе с удаленными системами по протоколу SSH.

Общепринятой практикой является автоматическое присоединение к сессии tmux при входе в систему по SSH.

Однако что, если вы хотите иметь больше контроля над этим, например, иметь возможность выбирать из существующих сессий или создавать новую?

Это можно сделать с помощью Bash-скрипта.

🐧 Совместное безопасное использование и управление терминалами в режиме реального времени из веб-браузера

В следующих шагах мы покажем вам, как улучшить удаленный вход в систему по SSH с помощью скрипта Tmux Session Selector на Linux.

Шаг 1: Создание скрипта меню Tmux

Сначала мы создадим скрипт tmux_menu.sh со следующим содержанием.

Этот скрипт будет получать существующие сессии tmux, отображать их пользователю и позволять ему либо подключиться к одной из них, либо создать новую сессию.

#!/bin/bash



# Get a list of existing tmux sessions:

TMUX_SESSIONS=$(tmux ls | awk -F: '{print $1}')



# If there are no existing sessions:

if [[ -z $TMUX_SESSIONS ]]; then

    echo "No existing tmux sessions. Creating a new session called 'default'..."

    tmux new -s default

else

    # Present a menu to the user:

    echo "Existing tmux sessions:"

    echo "$TMUX_SESSIONS"

    echo "Enter the name of the session you want to attach to, or 'new' to create a new session: "

    read user_input



    # Attach to the chosen session, or create a new one:

    if [[ $user_input == "new" ]]; then

        echo "Enter name for new session: "

        read new_session_name

        tmux new -s $new_session_name

    else

        tmux attach -t $user_input

    fi

fi

Сохраните этот скрипт в файле с именем tmux_menu.sh в домашнем каталоге.

Объяснение скрипта:

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

1. Скрипт Shebang:

#!/bin/bash

Шибанг (#!/bin/bash) используется для указания интерпретатора для выполнения скрипта.

В данном случае это bash.

Какова функция Шебанг в Linux?

2. Получим существующие сеансы tmux:

# Get a list of existing tmux sessions:

TMUX_SESSIONS=$(tmux ls | awk -F: '{print $1}')

В этом фрагменте tmux ls выводит список всех существующих сессий tmux.

Полученный результат передается по трубопроводу (|) в awk, который затем обрабатывает его для извлечения только имен сессий (перед двоеточием :).

Эти имена сохраняются в переменной TMUX_SESSIONS.

3. Проверим наличие существующих сеансов tmux:

# If there are no existing sessions:

if [[ -z $TMUX_SESSIONS ]]; then

    echo "No existing tmux sessions. Creating a new session called 'default'..."

    tmux new -s default

else

   ...

fi

Здесь блок if-else проверяет, пуст ли TMUX_SESSIONS (-z проверяет наличие строки нулевой длины).

Если он пуст, то это означает, что существующих сессий нет, поэтому с помощью команды tmux new -s default создается новая сессия с именем ‘default’.

Если он не пуст, то скрипт переходит к блоку else.

4. Отображение существующих сеансов и запрос пользователю:

 # Present a menu to the user:

    echo "Existing tmux sessions:"

    echo "$TMUX_SESSIONS"

    echo "Enter the name of the session you want to attach to, or 'new' to create a new session: "

    read user_input

В блоке else скрипт сначала отображает существующие сессии tmux.

Затем пользователю предлагается либо ввести имя существующей сессии, к которой он хочет присоединиться, либо набрать ‘new’ для создания новой сессии.

Команда read используется для перехвата ввода пользователя.

5. Обработка пользовательского ввода:

    # Attach to the chosen session, or create a new one:

    if [[ $user_input == "new" ]]; then

        echo "Enter name for new session: "

        read new_session_name

        tmux new -s $new_session_name

    else

        tmux attach -t $user_input

    fi

В зависимости от введенного пользователем значения используется еще один блок if-else для выполнения следующих шагов.

Если пользователь ввел “new”, то ему предлагается ввести имя новой сессии, которая затем создается с помощью команды tmux new -s $new_session_name.

Если пользователь ввел имя существующей сессии, то скрипт подключается к ней с помощью команды tmux attach -t $user_input.

Таким образом, данный скрипт предоставляет простой пользовательский интерфейс при входе в систему для присоединения к существующей сессии tmux или создания новой сессии, что повышает удобство работы с несколькими сессиями tmux.

Шаг 2: Сделаем скрипт исполняемым

Предоставьте права на выполнение сценария с помощью следующей команды:

chmod +x ~/tmux_menu.sh

Шаг 3. Обновление профиля Bash

Теперь обновите файл ~/.bash_profile на удаленной системе, чтобы вызывать этот скрипт при каждом входе в систему по SSH, но только если вы еще не находитесь в сессии tmux, а шелл интерактивна.

Откройте файл ~/.bash_profile в своем любимом редакторе:

nano ~/.bash_profile

Добавьте в него следующие строки:

# If not inside a tmux session, and if the shell is interactive, then run the tmux menu script

if [[ -z "$TMUX" ]] && [[ $- == *i* ]]; then

    ~/tmux_menu.sh

fi

Сохраните файл и закройте его, нажав CTRL+O, а затем CTRL+X.

Шаг 4: Проверка настройки меню выбора сеанса Tmux

1. С локального компьютера войдите по SSH в удаленную систему, используя следующую команду: ssh user@remote_system.

Пример:

ssh ostechnix@192.168.1.20

После успешного входа в систему вы будете автоматически подключены к сеансу Tmux “default“.

2. Войдя в удаленную систему, создайте несколько сеансов tmux, выполнив следующие команды:

tmux new -s tmux1 -d
tmux new -s tmux2 -d

Приведенные выше команды создадут две отсоединенные сессии Tmux, а именно tmux1 и tmux2.

Давайте проверим их, перечислив доступные сессии tmux:

tmux ls
default: 1 windows (created Mon Oct  2 13:31:25 2023)
tmux1: 1 windows (created Mon Oct  2 13:32:28 2023)
tmux2: 1 windows (created Mon Oct  2 13:32:32 2023)

Как видно, на моем удаленном сервере Debian 12 существует 3 сессии Tmux (по умолчанию, tmux1 и tmux2).

3. Теперь отсоединитесь от сеанса(ов) tmux (если вы присоединились к одному из них), используя Ctrl+b, а затем d.

Выйдите из текущей SSH-сессии.

4. Снова войдите по SSH в удаленную систему, и теперь в меню выбора сеанса tmux должно отображаться несколько сеансов.

ssh itsecforu@192.168.1.20
Linux debian12 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-1 (2023-07-14) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Oct  2 13:44:33 2023 from 192.168.1.101
Existing tmux sessions:
default
tmux1
tmux2
Enter the name of the session you want to attach to, or 'new' to create a new session:

5. Как видно из вывода, в меню выбора сеанса Tmux перечислены три существующих сеанса tmux.

Если вы хотите подключиться к любой из перечисленных сессий, просто введите имя сессии tmux и нажмите ENTER, и вы автоматически подключитесь к соответствующей сессии.

Если вы не хотите подключаться к существующей сессии, а хотите создать новую сессию, введите ‘new’, а затем имя новой сессии.

После ввода имени нового сеанса tmux нажмите клавишу ENTER, и вы будете присоединены к новому сеансу tmux.

Обратите внимание, что меню выбора сеанса tmux появится только в том случае, если активны два или более сеансов tmux.

Если активных сессий нет, то автоматически запускается новая сессия “default”.

Заключение

Каждый раз при такой настройкез, когда вы подключаетесь по SSH к удаленной системе, перед вами будет появляться меню выбора сеанса tmux.

Это позволяет лучше управлять сеансами tmux, обеспечивая более организованную и эффективную среду удаленной работы.

Теперь при следующем подключении к удаленной системе по SSH у вас будет возможность подключиться к существующей сессии tmux или создать новую, что поможет вам организовать свою работу и обеспечить легкий доступ к ней.

 



2023-10-03T14:13:49
Скрипты

🖧 Bash скрипт для сканирования диапазона портов

Сетевым администраторам и специалистам по безопасности часто требуется сканирование портов для выявления открытых или закрытых служб и оценки безопасности сети.

Хотя для этих целей существуют такие надежные инструменты, как nmap, иногда может потребоваться создание собственного решения, отвечающего конкретным требованиям.

Например, отсутствие возможности скачать и установить nmap.

В этой статье мы рассмотрим, как создать скрипт Bash для сканирования ряда портов.

Основы сканирования портов

Сканирование портов – это систематическая проверка системы на наличие открытых портов.

Порт в данном контексте – это логическая конструкция, идентифицирующая определенный процесс или тип сетевого сервиса.

Номера портов варьируются от 0 до 65535, причем первые 1024 известны как “общеизвестные порты”, назначаемые для таких распространенных протоколов, как HTTP (порт 80) и FTP (порт 21).

Сканирование портов позволяет определить, какие службы запущены и прослушивают соединения, что может быть особенно полезно для обнаружения потенциальных уязвимостей в системе безопасности.

Скрипт Bash для сканирования портов

Bash (Bourne Again SHell) – это мощная оболочка, с помощью которой можно создавать скрипты для автоматизации задач в среде Linux.

Наш скрипт будет принимать два аргумента – IP-адрес для сканирования и диапазон портов для сканирования.

Вот простой скрипт на Bash, который сканирует ряд портов:

#!/bin/bash



ip=$1

startport=$2

endport=$3





function portscan {

    for ((counter=$startport; counter<=$endport; counter++))

    do

        (echo > /dev/tcp/$ip/$counter) > /dev/null 2>&1 && echo "$counter open"

    done

}



portscan

Принцип работы скрипта

Первая строка (#!/bin/bash): Эта строка известна как shebang.

🌐 Шпаргалка по скриптам Bash

Она сообщает системе, что данный скрипт должен быть выполнен с помощью оболочки Bash.

Строки 3-5: Сценарий принимает три аргумента. $1 – IP-адрес, $2 – номер начального порта и $3 – номер конечного порта.

Строки 7-12: Здесь определяется функция portscan, которая сканирует каждый порт в заданном диапазоне.

Она пытается перенаправить эхо-вывод на определенный порт по IP-адресу.

Если запись в port прошла успешно (значит, порт открыт), то выводится номер порта, за которым следует “open”.

Использование скрипта

Для использования необходимо предоставить ему права на выполнение и запустить его с IP-адресом и диапазоном портов для сканирования.

  • Сохраните скрипт в файл, например portscan.sh
  • Сделайте скрипт исполняемым: chmod +x portscan.sh
  • Запустите скрипт с IP-адресом и диапазоном портов: ./portscan.sh 192.168.1.1 20 80
  • Будет произведено сканирование портов с 20 по 80 на IP-адресе 192.168.1.1.

Заключение

Несмотря на то, что данный скрипт подходит для базового сканирования портов, в нем отсутствуют многие функции, присущие более продвинутым инструментам, таким как nmap, например, обнаружение служб, определение ОС и более продвинутые методы сканирования портов.

Однако он позволяет понять, как работает сканирование портов и как его можно выполнить с помощью простого скрипта Bash.

см. также:

 



2023-07-24T17:36:40
Скрипты

🔒 Как проверить контрольную сумму SHA с помощью bash скрипта

Проверим контрольную сумму SHA с помощью скрипта.

Проблема

Во многих случаях контрольная сумма SHA предоставляется как есть, файл контрольной суммы содержит только контрольную сумму.

ls -l
total 2728
-rw-rw-r-- 1 milosz milosz 2788190 Feb  7 16:15 starship-x86_64-unknown-linux-gnu.tar.gz
-rw-rw-r-- 1 milosz milosz      65 Feb 23 01:34 starship-x86_64-unknown-linux-gnu.tar.gz.sha256

cat starship-x86_64-unknown-linux-gnu.tar.gz.sha256
d99fda409e1be96b07a8687bdbb1162e75c4a3c4301e7bf853dfd01dcb34a33

Это создает проблему для стандартных служб.

shasum --check starship-x86_64-unknown-linux-gnu.tar.gz.sha256
shasum: starship-x86_64-unknown-linux-gnu.tar.gz.sha256: no properly formatted SHA checksum lines found

Поскольку они ожидают имя файла, связанное с заданной контрольной суммой, используя формат GNU или BSD.

shasum --algorithm 1 starship-x86_64-unknown-linux-gnu.tar.gz | tee starship-x86_64-unknown-linux-gnu.tar.gz.sha1
3abb968ef9afc057cd51af32f38fe398701421e1  starship-x86_64-unknown-linux-gnu.tar.gz
shasum --tag --algorithm 1 starship-x86_64-unknown-linux-gnu.tar.gz | tee starship-x86_64-unknown-linux-gnu.tar.gz.sha1
SHA1 (starship-x86_64-unknown-linux-gnu.tar.gz) = 3abb968ef9afc057cd51af32f38fe398701421e1

Такая контрольная сумма может быть проверена без каких-либо проблем.

shasum --check starship-x86_64-unknown-linux-gnu.tar.gz.sha1
starship-x86_64-unknown-linux-gnu.tar.gz: OK

Решение

Решение заключается в создании простого скрипта оболочки, который будет выполнять дополнительные шаги для проверки контрольной суммы SHA.

#!/bin/bash

# verify file checksum from a file



# checksum algorithms

algorithms=( 1 224 256 384 512 512224 512256 )



# file to check

file="$1"



# execute when there is one parameter

if [ "$#" -eq "1" ]; then

  # check if file exist

  if [ -f "${file}" ]; then

    # find checksum file

    for algorithm in "${algorithms[@]}"; do

      if [ -f "${file}.sha${algorithm}" ]; then

        echo "Found SHA${algorithm} checksum"

        words="$(wc -w < ${file}.sha${algorithm})"

        # verify checksum and pass the exit code

        if [ "$words" == "1" ]; then

          shasum --algorithm $algorithm --check <(echo $(cat ${file}.sha${algorithm})  $file)

          exit $?

        elif [ "$words" == "2" ] || [ "$words" == "4" ]; then

          shasum --algorithm $algorithm --check ${file}.sha${algorithm}

          exit $?

        fi

      fi

    done

  fi

fi

Он автоматически проверит контрольную сумму SHA (в стиле GNU или BSD).

chkfile starship-x86_64-unknown-linux-gnu.tar.gz
Found SHA1 checksum
starship-x86_64-unknown-linux-gnu.tar.gz: OK

Он также будет работать с файлом, содержащим только контрольную сумму.

chkfile starship-x86_64-unknown-linux-gnu.tar.gz
Found SHA256 checksum
starship-x86_64-unknown-linux-gnu.tar.gz: OK

Вы будете проинформированы в случае возникновения проблем.

chkfile starship-x86_64-unknown-linux-gnu.tar.gz
Found SHA256 checksum
starship-x86_64-unknown-linux-gnu.tar.gz: FAILED
shasum: WARNING: 1 computed checksum did NOT match

Вы можете немного расширить его, чтобы возвращать различные коды выхода, когда файл или его контрольная сумма не найдены.

см. также:



2023-05-10T09:03:46
Скрипты

🐧 Что такое $0 в скрипте Bash?

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

Это тоже переменная, но другая.

$0 – это одна из специальных переменных, которые есть в bash, и она используется для вывода имени файла скрипта, который в данный момент выполняется.

Переменная $0 может быть использована в Linux двумя способами:

  • Использовать $0 для поиска оболочки входа в систему
  • Использовать $0 для вывода имени выполняемого скрипта.

Итак, давайте начнем с первого.

Поиск оболочки, в которую вы вошли в систему, с помощью $0

Когда $0 не используется в скрипте, она хранит информацию о том, какую оболочку вы используете в данный момент.

Если вы выведете значение $0, система покажет вам, в какой оболочке вы сейчас вошли в систему.

Например, здесь я вошел в bash в одном окне, а в другом я использовал zsh, и печать значения $0 с помощью команды echo показала имена вошедших оболочек:

Теперь перейдем к тому, как ее можно использовать в скриптах.

Использование $0 в скриптах shell

Чтобы использовать переменную $0 в скрипте, достаточно использовать простой оператор echo с этой переменной, и он выведет имя файла.

Например, здесь я буду использовать простой скрипт hello world:

#!/bin/bash

echo "Hello World"

Если мне нужно использовать здесь переменную $0, все, что мне нужно сделать, это добавить следующую строку в конце:

echo $0

Чтобы сделать его более человекочитаемым, вы также можете использовать что-то вроде этого:

echo "The name of the script is: " $0

Таким образом, конечный результат будет выглядеть следующим образом:

#!/bin/bash

echo "Hello World"

echo "The name of the script is: " $0

А это вывод, когда я выполнил скрипт:

Небольшая, но эффективная переменная. Не так ли?

Другие специальные переменные в Bash

Если эта переменная показалась вам увлекательной, в bash есть еще больше специальных переменных, которые можно использовать в различных скриптах.

И если вы хотите узнать о них больше, у нас есть специальные руководства для этого:

 

 



2023-04-28T12:06:25
Скрипты

🐍 Python скрипт для отправки электронного письма через SMTP-сервер

Python с его обширной экосистемой библиотек позволяет легко создать скрипт для отправки электронных писем с использованием простого протокола передачи почты (SMTP).

В этой статье мы рассмотрим процесс создания скрипта Python для обмена сообщениями на основе сервера SMTP, что позволит вам с легкостью отправлять электронные письма.

1. Введение в SMTP и Python

SMTP – это стандартный интернет-протокол для передачи электронной почты.

Он определяет процесс, посредством которого сообщения электронной почты отправляются с одного почтового сервера на другой.

Библиотеки Python smtplib и email предоставляют простой в использовании интерфейс для работы с SMTP-серверами и создания почтовых сообщений.

2. Установка Python и необходимых библиотек

Чтобы начать работу, убедитесь, что в вашей системе установлен Python 3.6 или более поздней версии.

Вы можете скачать последнюю версию с официального сайта Python.

Необходимые библиотеки, smtplib и email, являются частью стандартной библиотеки Python и не требуют дополнительной установки.

🐍 Управление версиями Python с помощью pyenv

3. Настройка параметров сервера SMTP

Чтобы отправлять электронные письма через SMTP-сервер, необходимо указать следующие данные:

  • адрес SMTP-сервера
  • Порт SMTP-сервера
  • Учетные данные для аутентификации (адрес электронной почты и пароль)

Популярные почтовые службы, такие как Gmail, Yahoo и Outlook, имеют адреса и порты своих SMTP-серверов в открытом доступе.

Для Gmail адрес сервера – smtp.gmail.com, а порт – 587.

Примечание: Некоторые поставщики услуг электронной почты могут потребовать включить “Менее безопасные приложения” или создать “Пароль приложения” для аутентификации. Для получения дополнительной информации обратитесь к документации поставщика услуг электронной почты.

4. Создание простого электронной почты

Имея на руках информацию о SMTP-сервере, мы можем теперь создать Python скрипт для отправки электронной почты.

Вот пример:

import smtplib



from email.mime.text import MIMEText



from email.mime.multipart import MIMEMultipart



# Определение настроек электронной почты



smtp_server = 'smtp.gmail.com'



smtp_port = 587



email_address = 'you@gmail.com'



email_password = 'your-password'



# Создание письма



subject = 'Hello, World!'



body = 'This is a test email sent from a Python script.'



msg = MIMEMultipart()



msg['From'] = email_address



msg['To'] = 'recipient@example.com'



msg['Subject'] = subject



msg.attach(MIMEText(body, 'plain'))



# Отправка email



with smtplib.SMTP(smtp_server, smtp_port) as server:



    server.starttls()



    server.login(email_address, email_password)



    server.send_message(msg)



print('Email sent successfully!')

Замените email_address, email_password и recipient@example.com на ваш реальный адрес электронной почты, пароль и адрес электронной почты получателя соответственно.

5. Дополнение скрипта электронной почты вложениями и HTML-содержимым

Чтобы добавить вложения или HTML-содержимое в письмо, вы можете изменить скрипта следующим образом:

from email.mime.application import MIMEApplication

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.utils import COMMASPACE

import os



# Определение настроек электронной почты

smtp_server = 'smtp.gmail.com'

smtp_port = 587

email_address = 'you@gmail.com'

email_password = 'your-password'



# Создание сообщения электронной почты с содержимым HTML

subject = 'Hello, World!'

body = ('<h1>This is a test email sent from a Python script.</h1>'

'<p>It contains <strong>HTML content</strong> and an <em>attachment</em>.</p>')



msg = MIMEMultipart()

msg['From'] = email_address

msg['To'] = 'recipient@example.com'

msg['Subject'] = subject



msg.attach(MIMEText(body, 'html'))



# Add an attachment

attachment_path = 'example_file.pdf'

attachment_filename = os.path.basename(attachment_path)



with open(attachment_path, 'rb') as file:

attachment = MIMEApplication(file.read(), _subtype='pdf')

attachment.add_header('Content-Disposition', 'attachment', filename=attachment_filename)

msg.attach(attachment)



# Отправка почты

with smtplib.SMTP(smtp_server, smtp_port) as server:

server.starttls()

server.login(email_address, email_password)

server.send_message(msg)



print('Email sent successfully!')

В этом примере мы изменили переменную `body`, чтобы она содержала HTML-содержимое, и использовали `MIMEText(body, ‘html’)` для прикрепления HTML-содержимого к письму.

Чтобы добавить вложение, мы прочитали файл из указанного `attachment_path`, создали объект `MIMEApplication` и прикрепили его к письму.

Примечание: Не забудьте заменить `attachment_path` на фактический путь к файлу, который вы хотите прикрепить.

Заключение

В этой статье мы рассмотрели, как создать сценарий на Python для отправки электронных писем с помощью обмена сообщениями на основе SMTP-сервера.

Мы начали с базового сценария, научились добавлять HTML-содержимое и добавлять вложения в наши электронные письма.

Эти знания можно применять в различных скриптах, например, для отправки автоматизированных отчетов, уведомлений или информационных бюллетеней.

Как всегда, не забывайте придерживаться лучших практик и уважать конфиденциальность и предпочтения получателей при программной отправке электронных писем.

см. также:



2023-04-18T08:43:47
Скрипты

🐧 Как безопасно использовать команду read на Linux

Не стоит вводить пароли непосредственно в шелл скрипт.

Всякий раз, когда мы указываем пароль на Linux, он должен быть либо невидимым, либо звездочки (*) должны маскировать наш пароль так, чтобы он стал нечитаемым.

В этой теме мы рассмотрим различные техники чтения паролей с помощью Bash.

Как читать пароли на Bash?

Bash имеет встроенную утилиту для чтения ввода от пользователя, которая называется read.

 Проверка, содержит ли переменная число на Bash

Мы можем использовать эту утилиту напрямую, используя определенные флаги, которые в ней присутствуют.

С помощью этой команды мы также можем написать скрипт, который будет принимать ввод побуквенно и преобразовывать эти буквы в * на лету.

У нас также есть широко используемая команда для шифрования и расшифровки паролей, что обеспечивает их дополнительную защиту.

Чтение без отображения вводимых символов

Когда запрашивается пароль, bash может сделать так, чтобы вводимые символы не отображались на терминале.

#!/bin/bash

read -p "Enter name " name

echo "Hi, $name"

read -sp "Enter password " pass

echo

echo "$name has provided the password $pass"

echo

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

Пароль не видно, и все, что вводится пользователем в качестве пароля, не отображается.

Он хранится в переменной, и эта переменная выводится на терминал.

Мы убеждаемся, что пользовательский ввод не виден.

Для этого мы используем флаг -s, доступный в команде read, чтобы заглушить эхо от пользовательского ввода.

Это позволяет работать с командой read безопасным образом.

В результате bash не отображает то, что вводит пользователь.

Этот ввод хранится в переменной, переданной с командой read, и может быть обработан в соответствии с требованиями.

Чтение со звездочками

Когда запрашивается пароль, мы часто видим, что пароли заменяются звездочками (*).

Прямого способа сделать это в Bash не существует.

Однако мы можем сделать то же самое, написав скрипт.

#!/bin/bash

pass=""

pass_var="Your password :"      # to take password character wise

while IFS= read -p "$pass_var" -r -s -n 1 letter

do

    if [[ $letter == $' ' ]]       #  if enter is pressed, exit the loop

    then

        break

    fi

    

    pass=pass+"$letter"      # store the letter in pass

    pass_var="*"            # in place of password the asterisk (*) will be printed

done

Мы просим пользователя ввести пароль.

В цикле while мы используем IFS (Internal Field Separator) для разделения символов.

Команда read с флагом -r прочитает пароль.

Флаг -s гарантирует, что пароль будет прочитан безопасно.

Для отображения введенного пароля посимвольно мы ввели флаг -p с командой read.

Опция -n не выводит завершающую новую строку.

Скрипт запрашивает пароль и считывает его символ за символом до тех пор, пока пользователь не нажмет кнопку Enter.

Для каждого символа, который вводится из запроса, скрипт заменяет его на звездочку (*).

Чтение из файла

Существует множество случаев, когда у пользователь есть пароль или ключ, находящийся в файле.

Давайте сначала разберемся, как создать файл паролей.

Рекомендуется всегда держать файл паролей скрытым.

В Linux это можно сделать, создав файл, начинающийся с точки(.), например .passwd.txt.

Мы создадим этот файл, открыв ваш любимый редактор, введя пароль и сохранив его.

Чтобы защитить его еще больше, измените права на файл, чтобы никто другой не мог получить к нему доступ.

Для этого мы воспользуемся инструментом chmod.

Мы можем проверить права доступа к этому файлу с помощью команды ls -al.

Вот как мы это сделаем:

echo “password123” > .passwd.txt # Запись содержимого в файл
chmod 600 .passwd.txt # Предоставление соответствующих прав
ls -al .passwd.txt # проверка прав

#!/bin/bash

passFile=".passwd.txt"

pass=`cat $passFile`

echo Password read from the $passFile is $pass

Скрипт считывает пароль из файла passwd.txt с помощью команды cat.

Он сохранит пароль в переменной pass.

Как только пароль будет присвоен переменной, мы сможем выполнить любую дальнейшую обработку в соответствии с потребностями.

Безопасное чтение на Bash

Всегда рекомендуется шифровать пароли в скриптах на Linux bash.

Хранение паролей в виде обычного текста подвергает конфиденциальные данные серьезному риску.

Шифрование пароля для чтения

Если мы храним пароль в виде открытого, читаемого текста, любой человек, имеющий доступ к нашей системе, может его прочитать.

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

Существует инструмент командной строки под названием openssl, предоставляющий нам функции криптографии библиотеки OpenSSL.

#!/bin/bash

read -sp "Enter your password: " pass

encryptedPass=`echo $pass | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'An0terS3cr3t'`

echo

echo "Encrypted password is " $encryptedPass

Вводимый пароль шифруется с помощью инструмента openssl.

Вместе с ним передается множество параметров.

Давайте разберемся в назначении каждого из них.











ПараметрИспользуется для
enc -aes-256-cbcОн представляет собой тип шифрования. Мы используем 256 блоков Advanced Encryption Standard с Cipher Block Chaining (CBC).
md sha512Он представляет собой тип дайджеста сообщения. В нашем случае мы используем криптографический алгоритм SHA512
aОн представляет кодирование и декодирование в формате base64. Он выполняет операцию кодирования после шифрования и декодирования перед расшифровкой.
pbkdf2Она представляет собой функцию деривации ключа на основе пароля 2 (PBKDF2), которая гарантирует, что атаки методом перебора будут более сложными.
iterОн представляет собой количество вычислений, которые будут использоваться PBKDF2. В нашем случае мы рассмотрели 1000
saltОн представляет собой случайные данные, что гарантирует, что зашифрованные данные будут отличаться каждый раз, даже для одного и того же пароля.
passОн представляет собой пароль или ключ, который будет использоваться для шифрования данных. Мы приняли его за ‘An0terS3cr3t’.

Мы ввели в скрипт пароль ABCdef1@ и сохранили его в переменной.

Мы выполняем echo пароля и передаем вывод в качестве входа команде openssl.

Затем openssl, используя указанные параметры, шифрует его.

Расшифровка зашифрованного пароля

Так же, как мы пытались зашифровать пароль, мы можем расшифровать его.

Мы снова будем использовать команду openssl аналогичным образом.

#!/bin/bash

read -sp "Enter your password: " pass

encryptedPass=`echo $pass | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'An0terS3cr3t'`

echo

echo "Encrypted password is " $encryptedPass

decryptedPass=`echo $encryptedPass | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'An0terS3cr3t' -d`

echo

echo "Decrypted password is " $decryptedPass

Расшифровка пароля с помощью openssl происходит точно так же, как и шифрование.

Данные, взятые на вход, передаются команде open ssl вместе с параметрами.

Результат этой операции присваивается переменной, в которой хранятся расшифрованные данные.

Заключение

  • Пароли в виде простого текста представляют собой довольно серьезный и основной недостаток безопасности.
  • Команда read может быть использована для чтения паролей с помощью ее флагов.
  • Мы узнали, как создавать и читать скрытые файлы паролей.
  • Утилита openssl является широко используемым инструментом для шифрования и дешифрования.



2023-04-06T17:44:58
Скрипты