Существует ли способ сделать удаленный “ls” во многом как “scp”, удаленное копирует?

zebi z gaard не является тем же как zebi s gaard.

56
задан 2 March 2011 в 14:50
7 ответов

Вы могли всегда делать это:

ssh user@host ls -l /some/directory

Тот будет SSH к хосту, выполнить ls, вывести вывод назад Вам и сразу разъединиться.

78
ответ дан 28 November 2019 в 19:35

Да. SSH и делают ls:

ssh host ls /path

Вы могли легко написать сценарий этого, чтобы быть более гибкими, или использовать host:path синтаксис scp использование.

3
ответ дан 28 November 2019 в 19:35

Чтобы вывести список всех файлов в каталоге:

rsync host.name.com:directory/path/'*'

Для чего-то вроде найти каталог / путь -ls

rsync -r host.name.com:directory/path
11
ответ дан 28 November 2019 в 19:35

Я считаю, что чаще всего я использую это, чтобы получить результат 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
1
ответ дан 28 November 2019 в 19:35

Для всех, кто приходит через google к этому вопросу, потому что они ищут способ перечислить удаленные файлы, но не могут получить доступ к удаленному серверу через ssh (обычный случай для резервных серверов), вы можете использовать 'sftp'.

Пример:

sftp username@hostname.xyz
ls
cd somedir
exit

Запуск интерактивной сессии в определенном удаленном каталоге:

sftp [user@]host[:dir]
6
ответ дан 28 November 2019 в 19:35

Как уже упоминалось, если вы можете подключиться к хосту по 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, если только вы не экранируете $. Обычно проще использовать одинарные кавычки, чтобы избежать этого, но ваш пробег может отличаться. Иногда вам нужно что-то расширить локально И удаленно, что может быть сложно.

1
ответ дан 11 September 2020 в 22:18

Приведенные выше ответы не учитывают, когда вам нужно добавить пароль. Чтобы включить пароль и имя пользователя в одну команду, установите 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')
2
ответ дан 12 February 2021 в 19:03

Теги

Похожие вопросы