Как скопировать предпоследний файл с SSH на локальный с помощью скрипта

Я новичок в сценариях 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

Вы можете вставить свой скрипт в ShellCheck и исправить то, что он оплакивает; для начала вы не завершаете здесь-документ.

tink 21.11.2022 00:19

@tink да, я ошибся, спасибо за замечание. Я исправил сейчас. Хотя, почему последняя строка не может быть запущена? :(

CrazyCat 21.11.2022 00:28

pathFile и zipFile неизвестны скрипту вне ssh-сессии.

tink 21.11.2022 00:47

Есть ли возможность экспортировать «данные» (файл пути и файл zip) вне SSH-сессии?

CrazyCat 21.11.2022 01:00

Нет, не совсем.

tink 21.11.2022 01:08

Что за файл является файлом Penulitmate? В любом случае, я бы побежал отлаживать ваш скрипт с включенным -x, чтобы посмотреть, что происходит.

user1934428 21.11.2022 09:05

Вы можете внутри своей ssh-сессии записать содержимое переменной zipFile в какой-нибудь файл, а затем прочитать этот файл с помощью scp. В своем основном сеансе вы читаете этот файл (с scp), а затем знаете настоящее имя файла, который хотите передать.

user1934428 21.11.2022 09:11
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы можете 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 терпит неудачу по разным причинам.

user1934428 21.11.2022 09:13

Это потребует второго соединения ssh для проверки и просто усложнит задачу. Режим отказа и так достаточно прост.

tink 21.11.2022 19:18

Зачем вам еще одно соединение? zipFile — это переменная на вашем хосте, и вы проверяете ее там, непосредственно перед выполнением scp.

user1934428 22.11.2022 08:19

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

tink 22.11.2022 09:14

Нет - вы получаете эту информацию бесплатно. Предположим, что каталог пуст. Канал в вашем ssh-соединении (в частности, head в конце) ничего не вернет. Поэтому команда ssh ничего не выводит на стандартный вывод. Поэтому переменная zipFile будет пустой.

user1934428 22.11.2022 09:23

Другие вопросы по теме