SCP在Linux中使用Expect Spawn命令

时间:2016-02-17 05:37:21

标签: linux directory scp spawn

#!/usr/bin/expect -f

set login "root"
set addr "10.10.10.10"
set pw "123!"

set localDir "/home/user/www/*"
set servDir "/var/www/html/"



spawn scp -r $localDir $login@$addr:$servDir
expect "connecting (yes/no)?"
send "yes\r"
expect "$login@$addr\'s password:"
send "$pw\r"
interact

我需要将/ home / user / www /中的所有文件复制到/ var / www / html /但是当我使用目录字符串/ home / user / www / *在SPAWN中运行SCP命令时,它会给出一个错误。

以/ home / user / www /运行它不会,但它直接复制www文件夹,这不是我需要发生的。

1 个答案:

答案 0 :(得分:1)

选项A:

最佳方式是设置无密码登录。将密码裸露在网络上并不是一个好主意。设置验证密钥后,您可以使用scp而无需密码提示,甚至可以使用crontab

首先以用户a身份登录Sys_A并生成一对身份验证密钥。不要输入密码:

a@Sys_A:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa): 
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A

现在使用ssh在Sys_B上创建一个目录〜/ .ssh作为用户b。 (该目录可能已存在,这很好):

a@Sys_A:~> ssh b@B mkdir -p .ssh
b@Sys_B's password: 

最后将一个新的公钥附加到b @ Sys_B:.ssh / authorized_keys并最后一次输入b的密码:

a@Sys_A:~> cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
b@Sys_B's password:

从现在开始,您可以从Sys_A作为b登录Sys_B作为无密码:

一个@ Sys_A:〜> ssh b @ Sys_B

选项B

使用expect

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
#use correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact

bash的示例解决方案可能是:

#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'

这将等待进入和返回(暂时)交互式会话。

请参阅此SO question