LINUX.ORG.RU
ФорумAdmin

Вызов функции в sshpass.

 ,


0

1

Здравствуйте! Я уже писал на подобную тему ранее, ну решил создать новую тему, т.к. вопрос немного другой. Задача подключиться к другому серверу через ssh выполнить там определенные действия и вернуться назад, мне посоветовали утилиту sshpass, чтобы автоматизировать ряд действий, она с этим прекрасно справлялась пока я не решил усложнить задачу с помощью функций, на что посыпались ошибки(код и ошибки ниже), отсюда вопрос, а можно ли вообще использовать функции в таких местах, функции воспринимаются командами?

#функции не буду расписывать, так как смысла не вижу
function isroot(){
#проверка пользователя
}
function update(){
#обновление ПО
}
function inst(){
#установка ряда программ
}

function setup(){
	#функция для установки

	H=$1
	P=$2
	
	if [ -n "$H" ] && [ -n "$P" ]
		then 
		
			sshpass -p"$P" ssh -o StrictHostKeychecking=no root@"$H" << EOF
			#---------МОЖНО ЛИ ТУТ ВЫЗЫВАТЬ ФУНКЦИИ?----------
                        isroot
			update
			inst $H
                        #----------------------------------------------------
			exit
EOF
			if [ $PIPESTATUS -eq 0 ]
				then echo "$DAT: Команда sshpass с аргументами выполнена успешно. Аргементы: $H, $P" >> $LOG
				else echo "$DAT: Ошибка при выполнении команды sshpass." >> $LOG
				exit 4
			fi
		
		else echo "$DAT: Ошибка при передачи переменных в функцию" >> $LOG
	fi
}

setup "host" "password"
Ошибки, говорят, что команд таких нет.
-bash: line 1: isroot: команда не найдена
-bash: line 2: update: команда не найдена
-bash: line 3: inst: команда не найдена

Ответ на: комментарий от AnonimS

У тебя функции определены «на этой стороне», а вызываться пытаются «на той стороне», поэтому баш на той стороне и говорит, что таких команд не знает. Вставь определение функций после строки (или перед ней)
#---------МОЖНО ЛИ ТУТ ВЫЗЫВАТЬ ФУНКЦИИ?----------

imul ★★★★★ ()
Ответ на: комментарий от imul

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

AnonimS ()
Ответ на: комментарий от imul

А как передать переменную с этой стороны на ту? К примеру у меня есть переменные, которую я объявляю до sshpass(H=$,P=$2), ну как мне их передать после того как я зашел на другой сервер?

AnonimS ()
Ответ на: комментарий от AnonimS

Ну по идее переменные должен баш ещё на этой стороне подставить, надо только переменные перед этим экспортировать.
mike@pet ~ $ export TEST=passed ; ssh root@*** << EOF
echo ${TEST}
EOF

Pseudo-terminal will not be allocated because stdin is not a terminal.
passed

imul ★★★★★ ()
Ответ на: комментарий от AnonimS

А так команду можно загнать в переменную ещё на этой стороне. Отработает. У меня без sshpass, но и с ней разницы не будет.

mike@pet ~ $ export COMMAND=«yum -y update» ; ssh root@*** << EOF
${COMMAND}
EOF

Pseudo-terminal will not be allocated because stdin is not a terminal.
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.netaddicted.ca
* centosplus: centos.mirror.globo.tech
* epel: mirror.steadfast.net
* extras: centos.mirror.rafal.ca
* rpmforge: mirror.team-cymru.org
* rpmforge-extras: mirror.team-cymru.org
* updates: mirror.netaddicted.ca
No packages marked for update

imul ★★★★★ ()
Ответ на: комментарий от imul

Спасибо за информацию! Завтра попробую реализовать, а то уже голова не думает.

AnonimS ()

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

ssh user@host -p22 < file

edyard ()
Ответ на: комментарий от imul

Вроде разобрался, но хоть убейте не пойму почему переменная внутри передается. Что у нас получается, есть переменная ip, потом она через функцию передается в H, а я хочу еще ее передать внутрь блока EOF, получается 4 раз она переназначается.

Работает

function setup(){
	#функция для установки

	H=$1
	P=$2
	AD=$H
	if [ -n "$H" ] && [ -n "$P" ]
		then 
		
			sshpass -p"$P" ssh -o StrictHostKeychecking=no root@"$H" << EOF
                             function isroot(){}
                             function update(){}
                             function inst(){
                                 if [ $PIPESTATUS -eq 0 ]
				then echo "$DAT: Команда  выполнена успешно(сервер $AD)." >> $LOG
				else echo "$DAT: Ошибка при выполнении команды (сервер $AD)." >> $LOG
				exit 3
			         fi
                             }
                        isroot
			update
			inst
			exit
EOF
			if [ $PIPESTATUS -eq 0 ]
				then echo "$DAT: Команда sshpass с аргументами выполнена успешно(сервер $AD). Аргементы: $H, $P" >> $LOG
				else echo "$DAT: Ошибка при выполнении команды sshpass(сервер $AD)." >> $LOG
				exit 4
			fi
		
		else echo "$DAT: Ошибка при передачи переменных в функцию(сервер $AD)" >> $LOG
	fi
}

setup "host" "password"

Не работает

function setup(){
	#функция для установки

	H=$1
	P=$2
	
	if [ -n "$H" ] && [ -n "$P" ]
		then 
		
			sshpass -p"$P" ssh -o StrictHostKeychecking=no root@"$H" << EOF
                             function isroot(){}
                             function update(){}
                             function inst(){
                                AD=$1

                                if [ $PIPESTATUS -eq 0 ]
				then echo "$DAT: Команда  выполнена успешно(сервер $AD)." >> $LOG
				else echo "$DAT: Ошибка при выполнении команды (сервер $AD)." >> $LOG
				exit 3
                             }
                        isroot
			update
			inst $H
			exit
EOF
			if [ $PIPESTATUS -eq 0 ]
				then echo "$DAT: Команда sshpass с аргументами выполнена успешно(сервер $AD). Аргементы: $H, $P" >> $LOG
				else echo "$DAT: Ошибка при выполнении команды sshpass(сервер $AD)." >> $LOG
				exit 4
			fi
		
		else echo "$DAT: Ошибка при передачи переменных в функцию(сервер $AD)" >> $LOG
	fi
}

setup "host" "password"
Я даже пробовал что-то типа этого, все равно не пишется, самое главное переменные $LOG и другие передаются, а эта нет, если перенести опять до sshpass, то все что угодно передается..
...........................
sshpass -p"$P" ssh -o StrictHostKeychecking=no root@"$H" << EOF
                             #Сначала так попробовал
                             AD="Str1"
                             #Потом так
                            Q="Str1"
                             
                             function isroot(){}
                             function update(){}
                             function inst(){
                                #Потом и внутри функции
                                AD="Str1"

                                if [ $PIPESTATUS -eq 0 ]
				then echo "$DAT: Команда  выполнена успешно(сервер $AD $Q)." >> $LOG
				else echo "$DAT: Ошибка при выполнении команды (сервер $AD $Q)." >> $LOG
				exit 3
                             }
                        isroot
			update
			inst
			exit
EOF
............................

AnonimS ()
Ответ на: комментарий от edyard

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

AnonimS ()
Ответ на: комментарий от AnonimS

Да ты как-то изначально перемудрил сильно.
Делай проще. Пиши в файл не имена переменных, а сразу содержимое этих переменных.
То есть чтобы в том файле, который ты скармливаешь в ssh, стояло не apt install ${LIST}, а сразу apt-install foo bar bzik и т.д.
И контролировать первую фазу скрипта будет проще. Посмотришь в файл, а там все команды, которые надо выполнить.

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