Как я могу найти файл и запустить команду ssh, запрашивая пароль только один раз? - PullRequest
7 голосов
/ 07 июня 2011

Вот контекст вопроса:

Чтобы я мог печатать документы на работе, мне нужно скопировать файл на другой компьютер, а затем распечатать с этого компьютера.(Не спрашивайте. Это сложно и другого жизнеспособного решения нет.) Оба компьютера - Linux, и я работаю в bash.В настоящее время я делаю так: я scp передаю файл на компьютер печати, а затем ssh и печатаю из командной строки.

Вот что я хотел бы сделать:

Чтобы облегчить мне жизнь, я бы хотел объединить эти два шага в один.Я мог бы легко написать функцию, которая выполнила бы оба этих шага, но мне пришлось бы вводить свой пароль дважды.Можно ли как-то объединить шаги, чтобы я предоставлял свой пароль только один раз?

Прежде чем кто-либо это предложит, ssh-logins на основе ключей не подходят.Он был специально отключен администраторами по соображениям безопасности.

Решение:

В результате я сделал модификацию второго решения, предоставленного Wrikken.Простое завершение его первого предложения в функции сделало бы работу, но мне понравилась идея печати нескольких документов без необходимости вводить пароль один раз для каждого документа.У меня довольно длинный пароль, и я ленивый машинистка:)

Итак, я взял последовательность команд и обернул их в скрипт на python.Я использовал python, потому что хотел параметризовать скрипт, и я считаю, что это проще всего сделать в python.Я обманул и просто запускал команды bash с python через os.system.Python только что обработал параметризацию и управление потоком.Логика была следующей:

if socket does not exist:
    run bash command to create socket with timeout
copy file using the created socket
ssh command to print using socket

В дополнение к использованию тайм-аута, я также включил опцию есть в моем скрипте python, чтобы вручную закрыть сокет, если я захочу это сделать.

Если кому-то понадобится код, просто дайте мне знать, и я либо вставлю его в корзину, либо выложу в мой репозиторий git.

Ответы [ 2 ]

13 голосов
/ 07 июня 2011
ssh user@host 'cat - > /tmp/file.ext; do_something_with /tmp/file.ext;rm /tmp/file.ext' < file.ext 

Другой вариант - оставить открытый туннель ssh:

В ~ / .ssh / config:

Host *
        ControlMaster auto
        ControlPath ~/.ssh/sockets/ssh-socket-%r-%h-%p

.

$ ssh -f -N -l user host
(socket is now open)

Последующие запросы ssh / scp будут использовать уже существующий туннель.

0 голосов
/ 24 августа 2018

Вот шаблон bash-скрипта, который следует за @ вторым методом Вриккена , но может использоваться как есть - не нужно редактировать файл конфигурации SSH пользователя:

#!/bin/bash

TARGET_ADDRESS=$1 # the first script argument
HOST_PATH=$2 # the second script argument
TARGET_USER=root
TMP_DIR=$(mktemp -d)
SSH_CFG=$TMP_DIR/ssh-cfg
SSH_SOCKET=$TMP_DIR/ssh-socket
TARGET_PATH=/tmp/file

# Create a temporary SSH config file:
cat > "$SSH_CFG" <<ENDCFG
Host *
        ControlMaster auto
        ControlPath $SSH_SOCKET
ENDCFG

# Open a SSH tunnel:
ssh -F "$SSH_CFG" -f -N -l $TARGET_USER $TARGET_ADDRESS

# Upload the file:
scp -F "$SSH_CFG" "$HOST_PATH" $TARGET_USER@$TARGET_ADDRESS:"$TARGET_PATH"

# Run SSH commands:
ssh -F "$SSH_CFG" $TARGET_USER@$TARGET_ADDRESS -T <<ENDSSH
# Do something with $TARGET_PATH here
ENDSSH

# Close the SSH tunnel:
ssh -F "$SSH_CFG" -S "$SSH_SOCKET" -O exit "$TARGET_ADDRESS"
...