LINUX.ORG.RU

scp в Ubuntu 24.04

 , ,


0

2

Доброе время суток, знатоки!

Мне иногда приходится копировать определенные файлы с одного удаленного сервера на другой посредством 3-го управляющего сервера. На всех установлена Ubuntu 22.04. Я долгое время пользовался такой вот конструкцией:

scp -P <PORT> user@140.50.xx.xx:/patch/to/file/'qwerty-$(keygen-command).bin' user@140.50.yy.yy:/patch/to/file/
В результате существующий уже на первом сервере файл вида:
/patch/to/file/qwerty-12345.bin
передавался на второй сервер.

Но черт меня дернул обновиться на Ubuntu 24.04. Теперь эта команда не работает, шлет ошибку:

scp: /patch/to/file/qwerty-$(keygen-command).bin: No such file or directory
Все, приплыли, scp передала подстановку команды внутри одинарных кавычек $(keygen-command) как строку и отказывается интерпретировать ее как либо иначе. После долгих мыканий с различными вариантами кавычек и скобок пришел на поклон к чату GPT и он насоветовал разделить процесс на 2 шага:
сначала локально выполняется подстановка команды, чтобы получить имя файла,
затем это имя файла используется в команде scp.
Оно то сработало, но это такие костыли.. Неужели можно попрощаться с однострочной командой?


Ответ на: комментарий от e2ard

Ну так и настрой его нормально, чтобы не копировать файл на промежуточный сервер.

Host server
  HostName 140.50.yy.yy
  Port 22
  User user
  ProxyJump user@140.50.xx.xx:22
scp /patch/to/file/'qwerty-$(keygen-command).bin' server:/patch/to/file/
anonymous
()
Ответ на: комментарий от anonymous

Ну так и настрой его нормально, чтобы не копировать файл на промежуточный сервер.

При чем тут это вообще? Где у меня копирование на промежуточный сервер? Проблема в интерпретации внутри строки csp. На 22.04 убунте такой проблемы не возникает

e2ard
() автор топика

Я удивлён что оно у тебя раньше работало, по-моему внутри одинарных кавычек ничего подставляться не должно. А зачем там кавычки то? Единственное, что они у тебя делают - это запрещают подстановку. Ну, если в выводе keygen-command не будет пробелов.

Мне кажется ты что-то напутал и команда была другой.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Я удивлён что оно у тебя раньше работало, по-моему внутри одинарных кавычек ничего подставляться не должно. А зачем там кавычки то? Единственное, что они у тебя делают - это запрещают подстановку.

Одинарные кавычки предотвращают интерпретацию подстановки команды оболочкой перед передачей её в scp. Команда должна выполняться на удаленном сервере, а не на управляющем. Логика такая: Управляющий сервер перередает команду на сервер А, чтобы он там сделал вычисление и скопировал свой файл на сервер B. Без всяких промежуточных копирований.

e2ard
() автор топика
Ответ на: комментарий от anonymous

твоя команда неправильная

«Это неправильные пчелы и они делают неправильный мед» или «Давайте спорить о вкусе устриц с теми, кто их ел»

Если бы не было проблемы, я бы ее не описывал.

e2ard
() автор топика
Ответ на: комментарий от e2ard

Почитай в чём отличие одинарных кавычек от двойных в bash.

Всё, что написано в одинарных кавычках не интерпретируется и не выполняется интерпретатором bash, а так и передаётся как строка.

Двойные кавычка раскрываются и обрабатываются, переменные заменяются на значения и прочее.

Тебе уже написали - используй двойные кавычки.

Ты не понимаешь отличия и пишешь чушь.

Вот почитай: https://rus-linux.net/MyLDP/consol/single-and-double-quotes-in-the-bash.html

И команда с одинарными кавычками у тебя никогда и нигде работать не могла.

anonymous
()
Ответ на: комментарий от anonymous

И команда с одинарными кавычками у тебя никогда и нигде работать не могла.

Ну что я еще могу сказать, это спор теоретика с практиком. По законам аэродинамики жуки не способны летать, а они летают. Этой командой я давно пользуюсь в составе скрипта и все там работало. Кроме 24-й Убунты, как оказалось. Я уже писал тебе, что команда передавалась на другой сервер строкой и там уже раскрывалась. В новой Убунте ничего не раскрывается, ни с одиночными кавычками, ни с двойными, ни с обратным апострофом, ни с чем либо еще.

e2ard
() автор топика
Ответ на: комментарий от e2ard

Ну-ну практик он. ГНУпрактик ты.

Если ты хочешь, чтобы на удалённом сервере выполнилась команда - пиши примерно вот так:

ssh user@140.50.xx.xx -p port 'scp /patch/to/file/qwerty-$(keygen-command).bin user@140.50.yy.yy:/patch/to/file/'

А если в том, что передаётся на другой сервер должна участвовать переменная, которая определяется на системе откуда запускается команда, то вот так:

ssh user@140.50.xx.xx -p port "scp /patch/to/file/qwerty-\$\(keygen-command\).bin user@140.50.yy.yy:/patch/to/file/"

А может быть даже вот так:

ssh user@140.50.xx.xx -p port "scp /patch/to/file/qwerty-\"\$\(keygen-command\)\".bin user@140.50.yy.yy:/patch/to/file/"
anonymous
()
Ответ на: комментарий от anonymous

Если ты хочешь, чтобы на удалённом сервере выполнилась команда - пиши примерно вот так:

Спасибо за обходные пути, которые я и так знаю. Решение конечно есть, но не от этой задачи. Проблем с ssh как раз и нету. Если внимательно прочитаешь название топика, то поймешь наконец, что проблема в scp. И по твоему методу мне придется создавать ssh ключи на всех удаленных серверах, которые таким образом взаимодействуют друг с другом. В то время, как мне достаточно было раздать на них пабкеи с одного управляющего сервера. Незачет вобщем =)

e2ard
() автор топика
Ответ на: комментарий от e2ard

Ну если ты начал писать глупости то пиши дальше.

Генерировать ключи на остальных серверах и раскидывать их не надо.

Достаточно прописать один публичный ключ на всех серверах в цепочке.

Существует такое понятие как передача ключей или Agent forwarding.

В ssh для этого служит ключ ssh -A ..., в scp уже не нужно будет, а может и нужно будет.

Доверяю это нашему глубокоуважаемому практику проверить самостоятельно. Который ужас не знал что такое передача ключей.

anonymous
()
Ответ на: комментарий от anonymous

Ну если ты начал писать глупости то пиши дальше.

Спор ниочем. Я много еще чего не знаю в линуксе, с чем мне не приходилось сталкиваться, странно и неприлично в это тыкать пальцем. И прооблема с scp в новой убунте от этого сама собой не исчезнет. Я всего лишь хотел обратить внимание на то, что команда, которая ДОЛЖНА работать и РАБОТАЛА в 22-й убунте, не работает в 24-й. Все остальное - словоблудие, не относящееся к теме. Я переделал скрипт, согласно описанию в стартовом топике. Не так изящно, как было, но работает. Если по теме больше нечего сказать, считаю спор законченным. И да, знаю, что есть оппоненты, которым просто жизненно необходимо вставить последнее слово, еще и задев при этом. Я не возражаю =)

e2ard
() автор топика
Ответ на: комментарий от e2ard

Дурашка, я с тобой не спорю я тебе говорю как лучше сделать и как сделать более правильно, а твоя команда которую ты привёл лично я я бы в страшном сне её не подумал использовать будь хоть я под наркотиками будь Я хоть обдолбанный и в крайней степени опьянения. Я тебе написал если тебе нужно чтобы команда выполнила на другом сервере с частичной передачей параметров или выполнением некоторые команды при передаче то есть делай вот так точка то как ты делаешь это через жопк.

anonymous
()
Ответ на: комментарий от e2ard

А по поводу тыкать что кто-то чего-то не знает Так это ты первый начал сказал что ты практика, а я типа теоретик и ничего не знаю.

А как обделался сразу начинаешь ой меня обижают.

anonymous
()
Ответ на: комментарий от e2ard

scp не передаёт никаких команд, он передаёт имена файлов. Выполнять какие бы то ни было команды на той стороне он не должен вообще. Если у тебя действовала подстановка в имени файла на удалённом сервере уже после его передачи - это очевидный баг и, возможно, уязвимость (ты не давал доступа к шеллу, только к файлам, а он команды запускает), и правильно что его пофиксили.

firkax ★★★★★
()
Ответ на: комментарий от arkhnchul

Да, если вообще такое как-то работало - это была бага

Оно работало на всех предыдущих версиях убунты. Странно, что такая дыра не была пофикшена столь долгое время, правда?

e2ard
() автор топика
Ответ на: комментарий от e2ard

Странно, что такая дыра не была пофикшена столь долгое время, правда?

вообще говоря нет, я бы даже не назвал это дырой - команда не должна выйти за права пользователя, под которым осуществляется вход. Просто баг в поведении. Имхо, можно запилить фичреквест (или лучше патч), чтобы сделать таковое поведение опционально возможным.

arkhnchul ★★★
()
Ответ на: комментарий от anonymous

Посмотри работу на Debian Sid и Ubuntu 24.04.

На 24.04 не работает, топик старт же.

Проверил еще до кучи на arch linux - не работает

Другие ОС ставить специально не буду, что имею, на том и проверил =)

e2ard
() автор топика
Ответ на: комментарий от axle_nix

Попробуй запустить scp с ключом -O.

ЛоЛ и это сработало!

Зашел в man посмотреть на это чудо и обнаружил:

-O      Use the legacy SCP protocol for file transfers instead of the SFTP protocol.  Forcing the use of the SCP protocol may be necessary for servers that  do not  implement  SFTP,  for  backwards-compatibility  for particular filename wildcard patterns and for expanding paths with a ‘~’ prefix for older SFTP servers.

Мда.. Даже если бы я сразу залез в man, я бы вряд ли обратил внимание на этот ключ. Спасибо тебе добрый человек! =))

Вопрос решен

e2ard
() автор топика