#!/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文件夹,这不是我需要发生的。
答案 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