Я новичок в сценариях bash, и я пытаюсь создать сценарий, который может скопировать предпоследний файл из папки с машины B (ssh) на машину A (локальную). На данный момент я застрял на этом этапе (см. ниже), когда получаю сообщение об ошибке, когда скрипт пытается скопировать файл.
Заранее спасибо!
Вход:
#!/bin/bash
userName=`whoami`
myLocation=`pwd` #machineA or local
ssh $userName@machineB << 'ENDSSH'
pathFile = "/somefolder/folder_1/businessfolder/"
cd $pathFile
ls -ltrh
zipFile=`ls -Art | tail -n 2 | head -1`
echo $zipFile
ENDSSH
scp $userName@machineB:$pathFile$zipFile $myLocation
Вывод (просто ошибка):
scp: .: not a regular file
@tink да, я ошибся, спасибо за замечание. Я исправил сейчас. Хотя, почему последняя строка не может быть запущена? :(
pathFile и zipFile неизвестны скрипту вне ssh-сессии.
Есть ли возможность экспортировать «данные» (файл пути и файл zip) вне SSH-сессии?
Нет, не совсем.
Что за файл является файлом Penulitmate? В любом случае, я бы побежал отлаживать ваш скрипт с включенным -x
, чтобы посмотреть, что происходит.
Вы можете внутри своей ssh-сессии записать содержимое переменной zipFile
в какой-нибудь файл, а затем прочитать этот файл с помощью scp
. В своем основном сеансе вы читаете этот файл (с scp
), а затем знаете настоящее имя файла, который хотите передать.
Если вы можете touch ~/.hushlogin
на machineB
для userName
, должно работать следующее (у меня сработало):
#!/bin/bash
userName=$(whoami)
myLocation=$(pwd)
pathFile = "/somefolder/folder_1/businessfolder/"
zipFile=$(ssh -T -q $userName@machineB <<ENDSSH
cd $pathFile
ls -Art | tail -n 2 | head -1
ENDSSH
)
scp "$userName"@machineB:"$pathFile$zipFile" "$myLocation"
Для безопасности я бы охранял scp
с помощью [[ -n $zipFile ]] && scp ...
, чтобы поймать случай, когда в $pathFile
нет записей или что ssh
терпит неудачу по разным причинам.
Это потребует второго соединения ssh для проверки и просто усложнит задачу. Режим отказа и так достаточно прост.
Зачем вам еще одно соединение? zipFile
— это переменная на вашем хосте, и вы проверяете ее там, непосредственно перед выполнением scp
.
Переменная может быть на моем хосте, но файл находится на удаленном хосте. Проверка на его существование требует дополнительного подключения...
Нет - вы получаете эту информацию бесплатно. Предположим, что каталог пуст. Канал в вашем ssh-соединении (в частности, head
в конце) ничего не вернет. Поэтому команда ssh
ничего не выводит на стандартный вывод. Поэтому переменная zipFile
будет пустой.
Вы можете вставить свой скрипт в ShellCheck и исправить то, что он оплакивает; для начала вы не завершаете здесь-документ.