Как WinSCP может предоставить пользователю sudo для выполнения scp?

Инструмент WinSCP может выполнять sudo на удаленном компьютере для выполнения scp в качестве пользователя sudo. Это заставляет меня думать, что это должно быть возможно и с командной строкой scp .

Как обстоит дело с WinSCP?

Я не хочу работать с решением с пользовательским промежуточным каталогом . Файлы могут быть настолько большими, что я должен отправлять сообщения напрямую с помощью пользователя sudo . В результате файл копируется, но в мой локальный каталог, а не в sudo dir.

Одним из решений может быть ручное соединение по ssh :

 tar zcvf - MyBackups | ssh [email protected] "cat > /path/to/backup/foo.tgz" 

Который, я думаю, мог бы настроить sudo следующим образом:

 cat local.txt | ssh [email protected] "sudo -u sudouser cat > ~/remote_file" 

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

Howe могу ли я позволить scp обрабатывать прямую копию на удаленный, используя sudo чтобы изменить пользователя, чтобы получить доступ к его привилегиям.

Scp работает, создавая соединение ssh с удаленным сервером, а затем используя это соединение для выполнения другой команды scp на удаленной системе. Локальный экземпляр scp и удаленный экземпляр взаимодействуют через ssh-ссылку для отправки или получения файлов.

Сценарий OpenSSH, в частности, строит командную строку scp для запуска в удаленной системе. Затем он запускает ssh для запуска этой команды. Вызываемая команда ssh эквивалентна этому:

 /path/to/ssh [ssh options...] "scp [scp options...]" 
  • / Path / to / ssh обычно является встроенным путем для программы ssh.
  • [Ssh options …] – один или несколько параметров для программы ssh.
  • «Scp [scp options …]» – это единственный аргумент, содержащий команду scp и ее аргументы для запуска в удаленной системе.

Скриншот OpenSSH не предоставляет много способов выбора формы удаленной команды scp. Нет способа заставить его вызывать нечто иное, чем «scp», или вставить что-то вроде «sudo» перед частью «scp».

Как вы заметили, scp имеет возможность вызывать некоторую другую программу, а не ssh. Кто-то, кто знал, как написать программу-оболочку ssh и заставить scp вызывать оболочку вместо прямого вызова ssh. Обертка должна будет проанализировать аргументы командной строки, чтобы найти ту, которая содержит команду scp, по желанию изменить команду, а затем вызвать ssh с измененными аргументами командной строки.

Как работает SCP

Внутренняя работа scp зависит от двух недокументированных форм scp , которые являются scp -f и scp -t . В основном это удаленные серверы, которые прослушивают stdin и генерируют данные по stdout. Эти процессы используют протокол, аналогичный тому, что сделал бы sftp. Более подробную информацию можно найти в блоге Oracle .

Когда scp запускается, он сначала начнет сеанс ssh, чтобы запустить scp -t или scp -f . Затем ваш локальный процесс scp свяжется с удаленным процессом scp помощью stdout и stdin, переданных в ssh (полностью зашифрованный), и будет использоваться как stdin / stdout для удаленного сеанса scp .

Как настроить

Команда scp предоставляет параметр -s который позволяет вам настроить программу, используемую для настройки удаленного сеанса scp . Ожидается, что он будет обрабатывать все параметры, типичные для ssh . Чтобы помочь отлаживать, как это может выглядеть, мы устанавливаем фиктивную программу, которая просто сбрасывает параметры:

/tmp/scp-dump.sh:

 echo $0 $* 

Мы выполним его следующим образом:

 scp -S /tmp/scp-dump.sh /tmp/dump.txt [email protected]:/tmp 

И соответственно получаем следующий результат:

 /home/me/dump.sh \ -x -oForwardAgent=no \ -oPermitLocalCommand=no \ -oClearAllForwardings=yes \ -l me -- server.com scp -t /tmp 

Для удобства чтения были добавлены разрывы строк с обратной косой чертой.

Это позволяет нам изменять параметры и команды до отправки команды ssh .

Настройка sudo

Теперь мы можем написать программу для изменения параметров по мере необходимости, запустить ssh и использовать модифицированную форму для запуска scp -t . Мы будем в основном фиксировать параметры, ловушки, которые мы хотим использовать внутри, только добавлять дополнительные, и вносить изменения.

/tmp/scp-sudo.sh :

 add_ssh_option() { local option if [ $# = 2 ]; then option="$1 \"$2\"" else option="$1" fi if [ -z "${ssh_options}" ]; then ssh_options=${option} else ssh_options="${ssh_options} ${option}" fi } parse_options() { ssh_options= local option while [ $# > 0 ] ; do case $1 in -oSudoUser=* ) SSH_SUDO_USER=${option##*=} shift ;; -l ) ssh_user=$2 ; shift 2 ;; -i ) add_ssh_option "$1" "$2" ; shift 2 ;; -- ) shift ; break ;; -* ) add_ssh_option "${1}" ; shift ;; * ) break ;; esac done ssh_host=$1 shift ssh_command="$*" } parse_options "[email protected]" # To avoid intererence with Standard-In, we change this to # Strict: add_ssh_option "-oStrictHostKeyChecking=yes" if [ -z "${SSH_SUDO_USER}" ]; then # As before without sudo cat | ssh $ssh_options -l $ssh_user $ssh_host $ssh_command exit $? else # Send standard-in to the customized "scp -t" sink. cat | ssh $ssh_options -l $ssh_user $ssh_host sudo -i -u ${SSH_SUDO_USER} $ssh_command exit $? fi 

Теперь мы можем использовать модифицированную форму scp:

 scp -oSudoUser=other \ -i /tmp/me-id_rsa \ /tmp/scp-sudo.sh \ /tmp/dump.txt \ [email protected]:/tmp 

Это отлично подходит для отправки файла на удаленный. Однако, когда я возвращаюсь к удаленному файлу, он как-то зависает. Когда я прерываю сеанс (control-c), я вижу, что передача была успешной, но у меня есть какой-то дополнительный файл с именем «0». Интересно, может ли кто-нибудь помочь мне с этим?

Лучший вариант: sftp

Однако sftp намного лучше.

  1. Он имеет параметр -S – позволяет установить всю командную строку ssh. Мне было трудно понять это и заставить его работать. Я подозреваю, что не понимаю, как правильно привязать stdin / stdout из оболочки shell-ssh.
  2. Он имеет параметр -s (нижний регистр), позволяющий установить только подкоманду, отвечающую за настройку только удаленного сервера. Я нашел, что это облегчает работу.
  3. Вы можете установить удаленный путь, разрешения удаленных файлов, сделать put / get и т. Д. В соответствии с man-страницами для sftp.

В этом случае мы просто

 sftp -s "sudo -u sudo-user -- /usr/libexec/openssh/sftp-server" [email protected] 

Это дало мне счастливое приглашение « sftp> »

Обратите внимание, что подпрограмма иногда находится в разных путях, например /usr/libexec/openssh/sftp-server . Я бы предложил разбор строки из строки « Subsystem sftp » из файла /etc/ssh/sshd_conf ?

  • Предварительно санкционируйте sudo? (Так что это можно запустить позже)
  • как запустить две команды в sudo?
  • Допустимо ли и безопасно ли запускать pip install в sudo?
  • Ошибка: XDG_RUNTIME_DIR не установлен в среде. Gtk-WARNING **: невозможно открыть дисплей:
  • Мелкозернистая конфигурация sudoers (допустимые аргументы командной строки)
  • Открытие оболочки Explorer с правами администратора на XP (с установленным IE7)
  • Как я могу запускать команды в PowerShell с разрешениями администратора?
  • sudo echo "something" >> / etc / privilegedFile не работает ... есть ли альтернатива?
  • Потерянный sudo / su на примере Amazon EC2
  • Как запустить мое приложение в качестве суперпользователя из Eclipse?
  • Как добавить в файл как sudo?
  • Interesting Posts

    Когда я инвертирую цвета экрана, почему он не инвертируется через пару секунд?

    Как установить тайм-аут блокировки сокетов в boost asio?

    stream запускается перед вызовом Thread.start

    Я хочу расширить раздел на моем SSD-загрузке, но на этом пути есть раздел восстановления и системный раздел EFI. Как я могу обойти это?

    В WPF, каковы различия между атрибутами x: Name и Name?

    Нарушение изменений в .NET 4.0

    Сетевая карта (индикатор состояния соединения) по-прежнему активна после выключения из Windows 7 (но не из XP)

    Как выбрать первый, второй или третий элемент с заданным именем classа?

    Как отключить опцию отключения на экране входа в систему?

    Индикатор выполнения в VBA Excel

    Тест для ненулевой строки длины в Bash: или

    почему ngOnInit вызывается дважды?

    if-else vs ifelse со списками

    mySQL конвертировать varchar на сегодняшний день

    В каком порядке следует устанавливать драйверы, программы и обновления после установки новой Windows?

    Давайте будем гением компьютера.