Чтобы вывести список всех файлов в каталоге:
rsync host.name.com:directory/path/'*'
Для чего-то вроде найти каталог / путь -ls
rsync -r host.name.com:directory/path
Я считаю, что чаще всего я использую это, чтобы получить результат ls, простой список файлов без всех разрешений, дат и тому подобное, и сохранить его в локальном файле.
{ ssh me@host.com "cd /dir/of/interest; ls -1f *.txt;" } > /home/me/listoffiles.txt
Вы можете запускать все, что хотите, в кавычках. Весь вывод попадает в ваш локальный текстовый файл. Или, если вы хотите запустить на сервере большой неприятный сценарий и захватить весь его вывод, даже ошибки:
{ ssh me@host.com <script.remote.sh } > /home/me/output.log 2>/home/me/output.err
Для всех, кто приходит через google к этому вопросу, потому что они ищут способ перечислить удаленные файлы, но не могут получить доступ к удаленному серверу через ssh (обычный случай для резервных серверов), вы можете использовать 'sftp'.
Пример:
sftp username@hostname.xyz
ls
cd somedir
exit
Запуск интерактивной сессии в определенном удаленном каталоге:
sftp [user@]host[:dir]
Как уже упоминалось, если вы можете подключиться к хосту по SSH, вы можете делать все, что захотите.
Вы можете использовать либо ssh user@host
, либо псевдоним ssh
(определено в ~/.ssh/config
)
Редактировать: Исправлены некоторые примеры, когда вся отправляемая команда заключалась в одинарные кавычки. Спасибо @dave_thompson_085 за указание на проблему.
$ ssh user@host 'ls /dir/file'
Вы упомянули, что не хотите получать сообщения об ошибках от ls
, если файл не существует.
Один из вариантов — просто отбросить сообщения об ошибках.
$ ssh user@host 'ls /dir/file 2>/dev/null'
Это также сохранит возврат. Таким образом, $?
будет равно 0, только если команда ls нашла /dir/file. Это хорошо, потому что работает с файлами, папками, символическими ссылками и всем, что может быть указано с помощью ls.
Еще один вариант – проверить, существует ли файл, прежде чем выводить его в список.
$ ssh user@host '[ -f /dir/file ] && ls /dir/file'
Вы также можете проверить и просмотреть папку, но синтаксис изменится
$ ssh user@host '[ -d /dir/sub ] && ls /dir/sub'
Вы также можете связать и проверить ЛЮБУЮ папку
$ ssh user@host '[ -f /dir/file ] || [ -d /dir/file ] && ls /dir/file'
Вы также можете просто проверить, существует ли элемент, и ничего больше
$ ssh user@host '[ -f /dir/file ] || [ -d /dir/file ]'
$ echo $? # exit code will be 0 ONLY if the file exists
0
Возможно, вы захотите также включите проверку символических ссылок с [ -L /my/target]
.
Вы можете запускать условные коды удаленно
$ ssh user@host '[ -f /dir/file ] && echo "File EXISTS!" || echo "File NOT FOUND!"'
File EXISTS!
Или локально, если вы перемещаете команды за пределы командной строки
$ ssh user@host '[ -f /dir/file ]' && echo "File EXISTS!" || echo "File NOT FOUND!"
File EXISTS!
Однако способ работы с кавычками и раскрытием может быть сложным. Если вы используете двойные кавычки вне основной команды (вместо одинарных кавычек, как указано выше), переменные будут расширены ДО подключения ssh, если только вы не экранируете $
. Обычно проще использовать одинарные кавычки, чтобы избежать этого, но ваш пробег может отличаться. Иногда вам нужно что-то расширить локально И удаленно, что может быть сложно.
Приведенные выше ответы не учитывают, когда вам нужно добавить пароль. Чтобы включить пароль и имя пользователя в одну команду, установите sshpass
.
Для Mac: $ brew install hudochenkov/sshpass/sshpass
Для Linux: sudo apt-get install sshpass -y
Затем:
$ sshpass -p your_password ssh user@ имя хоста ls /path/to/dir/
Вы также можете сохранить вывод:
$ sshpass -p your_password ssh user@hostname ls /path/to/dir/ > log.txt
В python3:
import subprocess
cluster_login_email = 'user@hostname'
cluster_login_password = 'your_password'
path_to_files = '/path/to/dir/'
response = subprocess.run([
'sshpass', '-p', cluster_login_password, 'ssh', cluster_login_email, 'ls',
path_to_files], capture_output=True)
response = response.stdout.decode("utf-8").split('\n')