Как скопировать предпоследний файл с 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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