Как скопировать файл с удаленного сервера в сценарии оболочки? - PullRequest
2 голосов
/ 22 марта 2011

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

#!/usr/bin/expect -f   
  spawn /usr/local/bin/scpdata.sh
  set timeout 3000
  expect "root@172.100.100.143's password:"
  set timeout 3000
  send "xxxx"
  set timeout 3000
  send "exit\r"
  expect eof

scpdata.sh file

#!/bin/bash
  scp test@172.100.100.143:/tmp/11-03-15_03:00:01.tar.gz /tmp

Но это не работает, где проблема и как это сделать? Пожалуйста, помогите

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Я бы предложил вместо этого использовать аутентификацию с открытым ключом (сгенерировать на клиенте пару открытых / закрытых ключей с ssh-keygen, добавить открытый (.ssh/id.pub по умолчанию) ключ к .ssh/authorized_keys на сервере & mdash; см. Страницу man ). Чем вы можете:

  • Заранее введите ключевую фразу для ключа, используя ssh-agent или
  • используйте ключ без ключевой фразы.

В последнем случае я предлагаю вам ограничить ключ определенной командой. Я не уверен, как установить команду для scp, но

ssh test@172.100.100.143 'cat /tmp/11-03-15_03:00:01.tar.gz' > /tmp/11-03-15_03:00:01.tar.gz

эквивалентно. Вы просто пишете command=" команду " перед вашим ключом в .ssh/authorized_keys. Тогда сервер ssh, авторизованный с помощью этого ключа, всегда будет запускать указанную команду независимо от того, что было указано в командной строке ssh. Это ограничивает ущерб, который может нанести злоумышленник, если он получит доступ к вашему ключу без пароля.

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

0 голосов
/ 22 марта 2011
  1. Вы никогда не «нажимаете ввод» при отправке пароля: send "xxxx\r"
  2. set timeout 3000 на самом деле не делает паузу - для тайм-аута устанавливается значение 3000 секунд (50 минут).Если вам нужно сделать паузу, sleep 3.
    • Если ваши ожидаемые закономерности верны, вам почти никогда не нужно явно спать.Используйте exp_internal 1 для отладки ваших шаблонов.
  3. Настройте ssh-ключи, и вам вообще не нужен ожидаемый скрипт.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...