2 заметки с тегом

ssh

Блуждая по вкладкам

27 февраля 2014, 16:36

Часто так бывает, что в терминале открыто с десяток табов, в каждом из которых висят ССШ-сессии на разные сервера.

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

Что же можно сделать?

Да всё просто, переименуем вкладки.

Правильные ребята подключаются к ССШ через конфиг — это и время сокращает, и меньше мусора в аргументах.

Нам нужно выполнить локальную команду. Смотрим ман по ssh-config:

LocalCommand
Specifies a command to execute on the local machine after successfully connecting to the server.
[...]
This directive is ignored unless PermitLocalCommand has been enabled.

То, что нужно. Обновляем конфиг нашего сервера:

Host build
User root
Port 22
Hostname 192.168.1.200
PermitLocalCommand yes
LocalCommand echo -n -e "\033]0; Cherry (Debian 7)\007"

Без директивы PermitLocalCommand всё это работать не будет.

Получаем такую вот красоту:

Быстрое решение для выполнения команд по SSH

14 ноября 2013, 0:21

Наткнулся на дискуссию Сапегина и Харитонова по поводу деплоя блога.
И тогда я задумался. А можно ли не устанавливая фабрик и подобное, полностью нативными средствами реализовать выполнение перечня команд на удалённом сервере?

Конечно, можно! Например, так:

ssh user@server "ls -l /home/"

Но если список команд будет большим, писать подобное станет слишком неудобно. Да и некрасиво.

Красивое решение

В юниксах любой текстовый исполняемый файл начинается с подобной строки:

#!/bin/bash

Это говорит ядру о том, что запускать файл нужно с указанного в данной строке интерпретатора. Что нам мешает изобрести свой интерпретатор? Да ничего.

Создаём файл /usr/local/bin/remote и делаем его исполняемым:

#!/bin/bash
if echo "$1" | grep ":" > /dev/null; then
	srv="`echo \"$1\" | awk -F\: '{ print \$1}'`"
	pth="`echo \"$1\" | awk -F\: '{ print \$2}'`"
	cmd="cd $pth;"
else
	srv="$1"
fi
cmd="$cmd cat | bash"
cat $2 | ssh "$srv" "$cmd"

Это и есть наш интерпретатор. Который тоже запускается с помощью интерпретатора :-) На входе принимаем адрес удалённого сервера и, если нужно, папку, в которую сразу перейдём.

Как всё работает

Создаём некий скрипт, который будет деплоить. Что-то вроде баш-скрипта, только исполняться он будет удалённо.

#!/usr/bin/env remote user@server:/path/to/project/
git checkout master
git pull
npm install
grunt deploy

Сделаем файл исполняемым и запустим. Данный перечень команд запустится на сервере user@server в папке /path/to/project/. Всё просто.

Из плюсов можно отметить использование ключей и ссш-конфигов. При отсутствии ключа спросит пароль.

Не полноценные баш-скрипты, конечно, и не мощный фабрик, но работает. Enjoy.

UPD: Развитие идеи от Артёма: https://github.com/sapegin/shipit