Вопрос или проблема
Я часто подключаюсь к удаленному серверу через ssh и мне нужно передавать файлы между этим удаленным хостом и моим локальным ПК. У меня нет прав администратора на этом сервере, и я не единственный, кто им пользуется. Полные пути к файлам на хосте могут значительно различаться от файла к файлу и обычно довольно длинные. Однако я обычно сначала передаю файлы в одну и ту же локальную папку. У меня настроено подключение ssh без пароля с моего локального устройства на удаленный хост.
Мой текущий «рабочий процесс» для этой небольшой операции использует scp и кажется мне очень неэффективным:
- Обычно я уже подключен по ssh в расположении соответствующего файла на удаленном хосте: я использую
readlink -f
, чтобы получить полный путь к файлу - Я копирую путь (расставаясь с клавиатурой для клика)
- Я переключаюсь на другой терминал на своем локальном компьютере и начинаю вводить
scp hostname:
- Я вставляю путь к файлу (еще один клик)
- Я завершаю команду
scp
названием локального каталога и выполняю ее
Когда мне необходимо делать это множество раз для множества файлов, которые не обязательно легко включить все сразу в одну команду, это действительно не кажется эффективным. Слишком много шагов, слишком много повторяющегося ввода и кликов.
В идеале мне бы хотелось иметь волшебную команду ‘scp2local_folder filename’, которую я мог бы использовать с удаленного хоста, чтобы выполнить все эти шаги сразу, но я не уверен, как это настроить. Все, что связано с полным подключением ssh без пароля с удаленного устройства на мой локальный ПК, кажется действительно плохой идеей, поскольку все остальные, кто использует сервер, могли бы подключиться к моему личному устройству. (Но, возможно, есть способ сделать это, используя тот факт, что я просто «отправляю обратно» файлы на устройство, с которого я конкретно подключаюсь?)
Вкратце: Какой самый эффективный способ (с точки зрения человеческих усилий) регулярно передавать несколько файлов с удаленного хоста в определенную папку локального компьютера, с которого я подключаюсь?
NB: Я использую WSL на своем локальном устройстве, что может быть актуально для всей этой «копирования и вставки».
Ответ или решение
Для эффективной передачи файлов с удаленного хоста на локальный ПК, исходя из вашего сценария, предлагаю несколько решений, которые значительно упростят и ускорят процесс, не нарушая при этом безопасность.
1. Использование scp
с однопараметрической командой
Создайте оболочку для упрощения команды scp
. Вы можете создать сценарий оболочки, который будет принимать имя файла и автоматически использовать команду scp
с правильными параметрами.
Пример скрипта scp2local.sh
:
#!/bin/bash
# Путь к локальной папке, куда вы хотите сохранять файлы
LOCAL_DIR="/path/to/local/folder"
# Проверка на наличие аргумента
if [ -z "$1" ]; then
echo "Использование: scp2local.sh <имя_файла>"
exit 1
fi
# Получение абсолютного пути к файлу и выполнение команды scp
FILE_PATH=$(readlink -f "$1")
scp -P 22 username@hostname:"$FILE_PATH" "$LOCAL_DIR"
Не забудьте сделать скрипт исполняемым:
chmod +x scp2local.sh
Теперь вы можете просто запускать ./scp2local.sh путь/к/файлу
из SSH сессии.
2. Использование rsync
для более эффективной передачи
Если у вас есть возможность использовать rsync
, это может быть более эффективно, особенно если вы передаете одно и то же количество файлов и хотите избежать повторной передачи:
rsync -avz username@hostname:path/to/remote/file /path/to/local/folder
3. Монтирование удаленной файловой системы
Если вы чаще работаете с файлами удаленного хоста, можно рассмотреть монтирование удаленной файловой системы с использованием SSHFS. Это позволит вам взаимодействовать с файлами на удаленном сервере напрямую, как будто они находятся на вашем локальном диске:
sudo apt-get install sshfs
mkdir ~/remote-folder
sshfs username@hostname:/path/to/remote/folder ~/remote-folder
После этого вы сможете легко копировать файлы в ~/remote-folder
без необходимости постоянно переключаться между экранами.
4. Создание alias для часто используемых команд
Добавьте alias в ваш файл ~/.bashrc
(или ~/.bash_aliases
), чтобы упростить часто используемые команды:
alias scp2local='scp username@hostname:'
После этого просто используйте:
scp2local /путь/к/файлу /путь/к/локальной/папке
Заключение
Ваш рабочий процесс может стать значительно более эффективным, если использовать один из предложенных методов. Выберите тот, что будет соответствовать вашим требованиям наилучшим образом, и настройте его под себя. Это поможет сократить время на передачу файлов и улучшить общую продуктивность.