LINUX.ORG.RU

Как заходить на сервер по SSH и подгружать свою цветовую палитру?

 , , ,


0

2

Здравствуйте, уважаемые форумчане, аноним и случайные посетители!

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

Была выбрана стратегия использовать alias

alias ssh="/usr/bin/ssh -t $@ \"mycutecommand\""

в качестве mycutecommand использовались такие два метода:

1. При помощи переменной LS_COLORS так:

ssh -t myserv "LS_COLORS='dir=0;33'; bash -i"

Такой метод не работает в принципе, даже на этапе отладки, без алиасов, так как вначале выполняется установка переменной, а затем запускается новый баш без этой переменной. (А без запуска bash команда выполняется, и соединение закрывается)

ssh -t myserv "bash -i \"LS_COLORS='dir=0;33'\"

так тоже не работает, так как баш пытается найти файл а не команду. Ключ -c тоже не помог.

2. Записью строки в ~/.dircolors

На этапе отладки оба варианта работают:

ssh -t myserver '[[ ! -f ~/.dircolors ]] && echo "DIR 00;33" > ~/.dircolors; bash -i'
/usr/bin/ssh -t yourserver "[[ ! -f ~/.dircolors ]] && echo \"DIR 00;33\" > ~/.dircolors; bash -i"

Но добавляя это в `alias ssh="` это не работает никак. Возможно, всему виной кавычки, возможно, всё портит переменная $@.

Поделитесь готовым решением или как правильно дописать свой код?

★★

Надо было export переменной делать, ну или как-то так:

[~]$ ssh -t serv "LS_COLORS='dir=0;33' exec bash -i"
$ echo $LS_COLORS 
dir=0;33
xaizek ★★★★★
()

SendEnv/AcceptEnv, но это потребует изменения конфига sshd

xgatron
()

решено через функцию в .bashrc

Bash alias does not directly accept parameters. You will have to create a function. stackoverflow

Решено функцией в .bashrc

$ tail -n4 ~/.bashrc
ssh() {
	echo 'connecting with colors through ssh() in ~/.bashrc';
	/usr/bin/ssh -t $@ "[[ ! -f ~/.dircolors ]] && echo \"DIR 00;33\" > ~/.dircolors; bash -i";
}

Эта функция вызывается при вводе ssh myserv. Уведомляет о хитром способе использования команды ssh и обращается уже напрямую к /usr/bin/ssh с моими параметрами.

Стоит отметить, что перед закрывающей фигурной скобкой в блоке определения функции последняя команда должна заканчиваться точкой с запятой ‘;’

znavko ★★
() автор топика
Последнее исправление: znavko (всего исправлений: 1)
17 марта 2021 г.
Ответ на: решено через функцию в .bashrc от znavko

Улучшение: добавлена проверка знакомых серверов

Скрипт больше не создаёт .dircolors для серверов, на которых уже бывали, и вроде как .dircolors должен быть:

~$ tail -n 40 ~/.bashrc

ssh() {
	#echo 'connecting with colors through ssh() in ~/.bashrc';
	#/usr/bin/ssh -t $@ "[[ ! -f ~/.dircolors ]] && echo \"DIR 00;33\" > ~/.dircolors; bash -i";
	#echo $1;
	# cat .ssh/.mydb
	# server1.com;srv2.net;srv.kool.org;much.network.co;
	dbfile=~/.ssh/.mydb
	echo 'Checking if server is known'
	tmpifs=$IFS
	IFS=';' read -r -a servers < "$dbfile"
	IFS=$tmpifs
	found='f'
	for element in "${servers[@]}"
	do
		if [[ $1 == $element ]]; then
			echo 'Server is known. Performing:'
			echo '/usr/bin/ssh' $@;
			/usr/bin/ssh $@
			found='t'
			break;
		fi
	done;
	if [[ $found == 'f' ]]; then
		echo "Server is unknown. Creating .dircolors on a new server: $1"
		if [ $(/usr/bin/ssh -t $1 "[[ ! -f ~/.dircolors ]] && echo \"DIR 00;33\" > ~/.dircolors;" | wc -l) -eq 0 ]; then
			echo '.dircolors is created successfully'
			servers[${#servers[@]}]=$1
			echo ${servers[@]}
			printf "%s;" "${servers[@]}" > "$dbfile"
		else
			echo 'Failed to create .dircolors'
		fi
		echo 'Performing:'
		echo '/usr/bin/ssh' $@;
		/usr/bin/ssh $@
	fi;

}


znavko ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.