SSH вышел без подключения к серверу в сценарии оболочки

#linux #bash #unix #ssh

#linux #bash #unix #ssh

Вопрос:

Я пытаюсь подключиться к серверам и компакт-дискам в каждом каталоге. Но когда я попытался подключиться по SSH к первому серверу, который является server1, ошибка, которую он выдал мне, была

Псевдотерминал не будет выделен, потому что stdin не является терминалом.

Это файл конфигурации и сценарий bash ниже:

getPatches.cfg

 SERVERLIST="server1;server2"
USERNAME=bob
DIRECTORY=/net/bob
  

сценарий bash

 #!/bin/sh

CFGFILE=getPatches.cfg

if ! [ -f $CFGFILE ] ; then
   echo "ERROR: $CFGFILE configuration file is missing"
   exit 1
fi
# READ $CFGFILE
. $CFGFILE
servers=$SERVERLIST
user=$USERNAME
directory=$DIRECTORY

#Tokenize ServerList
while IFS=';' read -ra ADDR; do
        for i in "${ADDR[@]}"; do
                ssh $user@$i
                AccessIntoDirectory="cd $directory"
                export AccessIntoDirectory
                ssh -q $i $AccessIntoDirectory
        done
done <<< "$servers"
  

Я сгенерировал открытый ключ SSH, и то, что должен сделать этот скрипт, — это подключить SSH к серверу и cd в каталог, который я хочу, но вместо этого он вышел и не подключился к серверу по SSH. Любая помощь была бы отличной!

Комментарии:

1. как вы обрабатываете пароли?

Ответ №1:

Решение использовать команду ssh без использования консоли (tty) — добавить опцию -t -t.

 ssh -t -t $user@$i
  

Ответ №2:

Сначала проверьте строку

 ssh $user@$i
  

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

Во-вторых, я хотел бы проверить, случайно ли вы использовали обратные метки `вместо тиков » или двойные кавычки «» в строке с

 `AccessIntoDirectory=`cd $directory`
  

который ошибочно запустил бы команду ‘cd’ и присвоил бы ее вывод переменной.

Комментарии:

1. Opps Извините, cd $ direcotory должен быть в двойных кавычках. Я попробовал SSH bob @server1, он успешно подключен к server1. Есть ли у вас какие-либо предложения о том, как решить ssh $ user @ $ i?

2. обычный ssh user@server запускает новый процесс ssh, подключается к внешнему хосту, пытается запустить интерактивную оболочку входа для user (что не удается) и завершает работу обратно на ваш локальный хост. Затем он устанавливает $AccessIntoDirectory значение «независимо» на вашем локальном хосте. После этого он запускает ‘cd whatever’ в качестве удаленной команды в новой оболочке и немедленно возвращается.