Скопируйте файл и перезапишите существующий файл.

У меня есть два изображения (image1.png и image2.png) в той же папке на моем сервере, я хочу запустить команду, которая перезаписывает image2.png в image1.png. Я предпочитаю перезаписывать изображение вместо его удаления, а затем заменять его другим. Как я могу достичь этого через командную строку ssh?

  • как я могу исключить конкретную папку в пункте назначения при использовании rsync?
  • Как скопировать каталог с только указанным типом файлов?
  • Ошибки файловой системы при восстановлении многих файлов
  • Как скопировать несколько файлов, но сохранить их расширения одинаково?
  • Найти и заменить все те же файлы между 2 каталогами
  • Загрузить файл по команде ssh и выполнить команду на удаленной машине
  • Как клонировать часть только для чтения файловой системы / proc
  • Где rsync копирует файл, если я не указываю удаленный путь?
  • 3 Solutions collect form web for “Скопируйте файл и перезапишите существующий файл.”

    ssh host "cd path/to/directory && cp image1.png image2.png" 

    && безопаснее, чем ; в случае сбоя cd , например, из-за опечатки: в таком случае cp не будет выполняться вместо возможного копирования неправильного файла.

    Без sudo команда ssh server "cd path/to/directory && cp image1.png image2.png" не имеет привилегий для chmod разрешений.

    Но с sudo это было бы, но после запуска ssh он никогда не вводит пароль для него на удаленном сервере, поэтому решение использует -S и передает пароль для sudo следующим образом:

    ssh server " cd path/to/directory && echo sudo_password | sudo -S chmod 600 image2.png && cp image1.png image2.png"

    РЕДАКТИРОВАТЬ:

    Однако, как отмечалось в @terdon, нам не нужно изменять разрешения здесь, но используйте sudo cp , поэтому он приходит к:

    ssh server " cd path/to/directory && echo sudo_password | sudo -S cp image1.png image2.png"

    или (в случае, если вы считаете, что ваш пароль может быть прочитан)

    ssh server -t " cd path/to/directory && sudo cp image1.png image2.png"

    UPDATE: также @terdon предупредил, и я добавил это, потому что считаю важным подчеркнуть и сделать акцент на такой возможной реализации:

    Я действительно удалю это предложение использования -S, оно не нужно и очень опасно (см. Комментарии @ mikserv и мой ответ). Это также бессмысленно. Единственное «преимущество», о котором вы говорите, это возможность использовать трубку, а в большинстве ситуаций вы можете просто направить на сервер. Вы также можете использовать sshpass, как вы предложили, или настроить sudo без пароля. Всевозможные способы, которые не хранят пароль сервера как открытый текст. – тердон

    С одной стороны, это хорошо для автоматизации, не получив пароль sudo password promts и, чтобы полностью автоматизировать код / ​​скрипт, вы должны добавить sshpass -p password ssh...

    Однако на сервере, где другие могут легко прочитать ваш пароль sudo, предоставленный в качестве открытого текста во время сеанса ssh который не рекомендуется с точки зрения безопасности. Итак, чтобы получить sudo с ssh и быть безопасным использованием ssh -t

    ssh -t server "cd path/to/directory && sudo chmod 600 image2.png && cp image1.png image2.png"

    Тем не менее, с -t невозможно ssh "sudo command"| command например, ssh -t server "cd path/to/directory && sudo"|grep "text" но это возможно с использованием файла -S и эхо-пароля, например ssh server 'echo password | sudo -S ls -l'| grep 'a' ssh server 'echo password | sudo -S ls -l'| grep 'a'

    Чтобы подключиться к серверу через ssh и запустить определенную команду, все, что вам нужно, это ssh "command"

    В вашем случае вы хотите скопировать файл (он перезаписывается по умолчанию), поэтому вам нужна команда cp . Он работает как cp /path/to/original /path/to/copy . Теперь вы сказали в своих комментариях, что при попытке это дает вам отказ в разрешении. Это означает, что вам нужно будет запустить команду как root. Это делается с использованием sudo , поэтому sudo cp /path/to/original /path/to/copy .

    Следующая проблема заключается в том, что ssh запускает неинтерактивную оболочку без tty, поэтому sudo не может запрашивать пароль. Для этого вам нужно использовать ssh's -t . Итак, все это вместе, вы можете сделать:

     ssh -t user@server sudo cp /path/to/image2.png /path/to/image1.png 

    Никогда не повторяйте свой пароль sudo как было предложено другим ответом. Это чрезвычайно опасно, так как это сделает его видимым для всех пользователей, подключенных к системе, и оно также будет храниться в вашем файле истории в виде обычного текста. Это означает, что все, что мне нужно сделать, это grep sudo ~youruser/.bash_history и у меня есть ваш пароль и полный доступ к серверу. Таким образом, любой злоумышленник, который получает доступ к серверу, теперь может делать все, что им нравится.

    Linux и Unix - лучшая ОС в мире.