У меня есть несколько n файлов в каталоге в моей системе unix. Есть ли способ написать shellscript, который будет передавать все эти файлы с помощью scp в указанную удаленную систему. Я укажу пароль в script, так что мне не нужно вводить его для каждого файла.
Автоматизировать передачу файла scp с помощью оболочки script
Ответ 1
Вместо пароля жесткого кодирования в оболочке script используйте SSH-ключи, это проще и безопаснее.
$ scp -i ~/.ssh/id_rsa [email protected]:/path/to/bin/*.derp .
если ваш закрытый ключ находится в ~/.ssh/id_rsa
Чтобы создать пару открытого/закрытого ключей:
$ ssh-keygen -t rsa
Вышеописанное будет генерировать 2 файла, ~/.ssh/id_rsa
(закрытый ключ) и ~/.ssh/id_rsa.pub
(открытый ключ)
Чтобы настроить SSH-ключи для использования (одноразовая задача):
Скопируйте содержимое ~/.ssh/id_rsa.pub
и вставьте в новую строку ~devops/.ssh/authorized_keys
в myserver.org
сервере. Если ~devops/.ssh/authorized_keys
не существует, не стесняйтесь его создавать.
Ясное руководство по эксплуатации доступно здесь.
Ответ 2
#!/usr/bin/expect -f
# connect via scp
spawn scp "[email protected]:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "PASSWORD\r"
}
}
interact
http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command
Ответ 3
вы также можете использовать rsync. Кажется, что он работает лучше для нескольких файлов, чем scp IMHO.
rsync -avzh /path/to/dir/ [email protected]:/path/to/remote/dir/
Обновление
Вы можете использовать rsync через ssh, добавив переключатель '-e':
rsync -avzh -e ssh /path/do/dir/ [email protected]:/path/to/remote/dir/
Ответ 4
#!/usr/bin/expect -f
spawn scp -r BASE.zip [email protected]:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
Ответ 5
почему бы вам не попробовать?
password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt [email protected]$Ip:/root/<PATH>
Ответ 6
Что можно сказать о подстановочных знаках или нескольких файлах?
scp file1 file2 more-files* [email protected]:/some/dir/
Ответ 7
rsync - это программа, которая ведет себя так же, как и rcp, но имеет много других опций и использует протокол удаленного обновления rsync, чтобы значительно ускорить передачу файлов, когда файл назначения обновлено.
Протокол удаленного обновления rsync позволяет rsync передавать только различия между двумя наборами файлов через сетевое соединение, используя эффективный алгоритм поиска контрольной суммы, описанный в техническом отчет, который прилагается к этому пакету.
Копирование папки из одного места в другое
#!/usr/bin/expect -f
spawn rsync -a -e ssh [email protected]:/cool/cool1/* /tmp/cool/
expect "password:"
send "cool\r"
expect "*\r"
expect "\r"
Ответ 8
Если вам будет удобно вводить пароль один раз для каждого запуска script, вы можете сделать это легко, используя главное соединение SSH.
#!/usr/bin/env bash
USER_AT_HOST="[email protected]" # use "[email protected]$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_HOST"
# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST"
# These do not prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy
# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world"
# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"
Ответ 9
Вы можете сделать это только с помощью открытых/закрытых ключей ssh. Или используйте шпатлевку, в которой вы можете установить пароль. scp не поддерживает передачу пароля в командной строке.
Инструкции для открытых/закрытых ключей можно найти здесь: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml
Ответ 10
Это будет работать:
#!/usr/bin/expect -f
spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 [email protected]:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact
Ответ 11
Попробуйте lftp
lftp -u $user,$pass sftp://$host << --EOF--
cd $directory
put $srcfile
quit
--EOF--
Ответ 12
Команда scp
может использоваться как традиционная UNIX cp
. SO, если вы это сделаете:
scp -r myDirectory/ [email protected]:TargetDirectory
будет работать