Можно ли указать другой порт ssh при использовании rsync?

366

Я пытался выполнить следующую команду:

rsync -rvz --progress --remove-sent-files ./dir user@host:2222/path

SSH работает на порте 2222, но rsync все еще пытается использовать порт 22, а затем жалуется на отсутствие пути, потому что, конечно, он не существует.

Я хотел бы знать, возможно ли rsync для удаленного хоста по нестандартному порту ssh.

Ketema
источник

Ответы:

136

Другой вариант: на хосте, с которого вы запускаете rsync, установите порт в конфигурационном файле ssh, то есть:

cat ~/.ssh/config
Host host
    Port 2222

Затем rsync через ssh будет общаться с портом 2222:

rsync -rvz --progress --remove-sent-files ./dir user@host:/path
Жоао Коста
источник
21
Хотя это не самый очевидный ответ, это все же очень хороший ответ. Стоит использовать конфигурацию SSH для любого хоста, к которому вы подключаетесь более одного или двух раз, так как это избавит вас от долгих размышлений и печати.
Джон Хант
5
На самом деле, хотя и справедливо, недостатком является то, что он становится невидимым, то есть через некоторое время можно забыть, что он находится в конфигурационном файле ssh, и не понять, как он работает, или один из ваших коллег может скопировать / вставить команду и не понять, почему это не работает в их аккаунте. Тем не менее, лично я предпочитаю не вводить номер порта все время.
Жоао Коста
1
Это ужасно это абсолютно несовместимо с NAT-портом. если вы не хотите иметь несколько DNS-имен для одного и того же IP-адреса, что является проблемой технического обслуживания
действуйте
1
@ melfect Ты что, шутишь? Я бы не назвал это ужасным, так как я бы назвал это величайшей вещью для тех, кому нужно rsyncмногократно заходить в странный порт, но каждый раз достаточно просто, чтобы забыть синтаксис.
Freedom_Ben
1
Хотя это облегчает вам соединение, это также облегчает хакерам, и ваш auth.log снова будет завален автоматическими попытками. Так что это как бы лишает смысла менять порты.
forthrin
625

Ваша командная строка должна выглядеть так:

rsync -rvz -e 'ssh -p 2222' --progress ./dir user@host:/path

это работает нормально - я использую его все время без необходимости каких-либо новых правил брандмауэра - просто обратите внимание, что сама команда SSH заключена в кавычки.

Klapa
источник
8
Интересно, почему это так - это такая очевидная необходимость, все еще довольно скрытая, поскольку это фактически создает псевдоним для двоичного файла ssh. (Это работало безупречно, хотя)
jsbueno
1
Работает с символом двоеточияuser@host:/path
ДмитрийСандалов
23
ключевой частью команды является -e 'ssh -p 2222', так что вы можете использовать это с различными параметрами rsync
Эван Донован
2
Обратите внимание, что если вам нужно указать ключ ssh, вы можете сделать это, например, -e 'ssh -i mykey -p 2222'
dranxo
9
почему --remove-sent-файлы? Если это опасно для исходных данных, лучше упомянуть об этом ...
Tiw
14

когда вам нужно отправить файлы через определенный порт SSH:

rsync -azP -e "ssh -p PORT_NUMBER" source destination

пример

rsync -azP -e "ssh -p 2121" /path/to/files/source user@remoteip:/path/to/files/destination
Технарь
источник
3
и что именно это добавляет к существующему ответу?
Крис Мэйс
посмотрите на формат и пример. Я упростил вещи здесь.
Технарь
4
Хорошо, вы удалили два необязательных варианта, но по сути ваш ответ точно такой же, как принятый ...
Крис Мэйс
2
Это более упрощено и отформатировано. Легче понять для новых учеников. Кстати, спасибо, что проголосовали без причины
Techie
13

используйте «опцию rsh». например:

rsync -avz --rsh='ssh -p3382' root@remote_server_name:/opt/backups

обратитесь к: http://www.linuxquestions.org/questions/linux-software-2/rsync-ssh-on-different-port-448112/

Сивей Шен 申思维
источник
У меня тоже сработало! Я не знаю, почему ответ с наибольшим количеством голосов не работает ...
ch271828n
У меня тоже сработало! Мне нужно было ключевое слово "--rsh"
Taewoo Lee
2

Немного оффтоп, но может кому-то помочь. Если вам нужно передать пароль и порт, я предлагаю использовать sshpassпакет. Команда командной строки будет выглядеть так: sshpass -p "password" rsync -avzh -e 'ssh -p PORT312' root@192.xx.xxx.xxx:/dir_on_host/

Tomas
источник
Это не работает, потому что клавиатурно-интерактивный портит поток данных, портя протокол.
Evi1M4chine
2

Я нашел это решение на сайте Майка Хайка Хостетлера, которое отлично сработало для меня.

# rsync -avz -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/
Rusty1
источник
3
и что именно это добавляет к существующему ответу?
Крис Мэйс
Хороший работает отлично. Спасибо :)
Самму Сундар
2

Правильный синтаксис - указать Rsync использовать собственную команду SSH (с добавлением -p 2222), которая создает безопасный туннель для удаленной стороны с использованием SSH, а затем подключается через localhost: 873

rsync -rvz --progress --remove-sent-files -e "ssh -p 2222" ./dir user @ host / path

Rsync работает как демон на TCP-порту 873, который не является безопасным.

От Rsync человек:

Нажмите: rsync [ОПЦИЯ ...] SRC ... [ПОЛЬЗОВАТЕЛЬ @] ВЕДУЩИЙ: DEST

Что вводит людей в заблуждение, чтобы попробовать это:

rsync -rvz --progress --remove-sent-files ./dir user @ host: 2222 / path

Однако это указывает ему подключиться к демону Rsync через порт 2222, которого там нет.

kevinf
источник
другие ответы не упоминали порт 873
kevinf
вопрос был в том, как заставить его работать как ssh через порт 2222; Требует ли rsync это другой вопрос.
Дэн Стейнгарт,
@ DanSteingart Я обновил ответ, теперь он помогает?
Кевинф
-3

Мне не удалось заставить rsync подключиться через ssh через другой порт, но я смог перенаправить соединение ssh на компьютер, который я хотел через iptables. Это не то решение, которое я искал, но оно решило мою проблему.

Ketema
источник