工具/原料
-
两台HP Unix服务器
-
SecureCRT
基础知识普及
-
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部份,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File TransferProtocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
客户端生成密钥对,分发公钥
-
进入系统家目录
首先需要在家目录创建.ssh文件夹
# ll –a
查看隐藏目录,默认此目录里如果没有.ssh隐藏目录,则需要手动创建
# mkdir .ssh
新建.ssh文件夹
-
#cd .ssh
进入.ssh目录
#ssh-keygen -t rsa
执行创建密钥对命令
Generating public/private rsa key pair.
Please be patient…. Key generation may take a few minutes
Enter file in which to save the key (/home/ap/appnms/.ssh/id_rsa):
# 按回车保存为: //.ssh/id_rsa,即当前用户的私钥
Enter passphrase (empty for no passphrase):
# 按回车,表示读取密钥时不需要密钥的密码
Enter same passphrase again:
# 确认密钥的密码,必须和上面的输入相同
Your identification has been saved in /home/ap/appnms/.ssh/id_rsa.
# 私钥保存信息
Your public key has been saved in /home/ap/appnms/.ssh/id_rsa.pub.
# 公钥保存信息
The key fingerprint is:
31:03:78:64:4f:8e:9d:a9:31:bf:38:5d:1a:79:08:e6 appnms@T254N0V4
# 密钥指纹
The key’s randomart image is:
+–[ RSA 2048]—-+
| o+ . |
| …B o |
| .* X |
| o * * |
| E S o |
| o * |
| o + |
| . |
| |
+—————–+
-
把.ssh目录下的公钥文件:/当前用户home目录/.ssh/id_rsa.pub文件传输到服务器上。
#scp/home/ap/appnms/.ssh/id_rsa.pub appmon@128.192.141.129:/ultranms/appmon/.ssh
此时仍需要输入密码,革命即将成功:)
服务器端添加信任公钥
-
登录服务器查看用户家目录:
#cat /etc/passwd | grep appmon
appmon:tAceUEMuTYB9Q:116:20::/ultranms/appmon:/sbin/sh
通过检查home目录为/ultranms/appmon 家目录的权限必须是755
-
# cd /.ssh
进入到.ssh目录 .ssh目录权限必须是755或者700
# cp id_rsa.pub authorized_keys
第一次添加时将公钥重命名为authorized_keys
# chmod 644 authorized_keys
公钥文件的权限必须是644
如果有多个客户端,依次将客户端公钥附加到服务器的authorized_keys文件内即可。
# cat /tmp/id_rsa.pub >> authorized_keys
测试传输
-
使用sftp访问测试是否配置成功,成功的现象是访问不需要输入密码-_—
#sftp appmon@128.192.141.129
如果不需要输入密码则公钥设置成功
只有第一次连接需要输入YES确认:
The authenticity of host ‘128.192.141.129 (128.192.141.129)’ can’t be established.
RSA key fingerprint is 91:b8:8e:85:8a:33:da:6e:04:a0:96:4d:9a:bb:57:67.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘128.192.141.129’ (RSA) to the list of known hosts.
Connected to 128.192.141.129.。
SFTP测试成功了,下面测试一下文件传输
-
# scp /需要上传源文件的绝对路径 目的用户名@IP地址:目的目录
示例:#
scp /home/ap/appnms/.ssh/id_rsa.pub appmon@128.192.141.129:/ultranms/appmon/.ssh
id_rsa.pub 100% 397 0.4KB/s 0.4KB/s 00:00
大功告成!
客户端脚本与crontab
-
写个简单的脚本示例:
test.sh
#/bin/sh
scp /home/ap/appnms/.ssh/id_rsa.pub appmon@128.192.141.129:/ultranms/appmon/.ssh
-
#crontab –e
/注:客户端根据实际情况修改crontab自动调用脚本。
注意事项
-
权限:如果配置完对等信任公钥,仍提示输入密码或者访问拒绝,则需要查看服务器的目录权限是否正确,家目录权限755,.ssh目录权限是755,authorized_keys文件权限是644
-
备份:authorized_keys不能出现空格等不是公钥的信息,否则公钥文件就会失效,每次附加新公钥时,养成变更前备份的好习惯
第二种
lftp方式
-
#!/bin/sh
-
HOST=172.16.2.X
-
USER=kg_sftp
-
PASS=tnzk4a7w
-
echo “Starting to sftp…”
-
lftp -u ${USER},${PASS} sftp://${HOST} <<EOF
-
cd /kagou/datafile
-
mget *.*
-
bye
-
EOF
-
echo “done”
第三种
expect方式
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。
要使用expect需要预先安装tcl这个东西,然后再安装expect包。
tcl:
http://prdownloads.sourceforge.net/tcl/tcl8.4.16-src.tar.gz
expect:
http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
例子:
-
#!/usr/local/bin/expect -f
-
#<—insert here your expect program location
-
#procedure to attempt connecting; result 0 if OK, 1 elsewhere
-
proc connect {passw} {
-
expect {
-
“(yes/no)?” {send “yes/r”;exp_continue} #第一次使用SFTP时候会要求输入yes/no
-
“password:” {send “$passw/r” #自动输入密码
-
expect {
-
“sftp*” { #检测返回sftp>
-
return 0
-
}
-
}
-
}
-
}
-
# timed out
-
return 1
-
}
-
-
#read the input parameters
-
set user [lindex $argv 0]
-
set passw [lindex $argv 1]
-
set host [lindex $argv 2]
-
set location [lindex $argv 3]
-
set file1 [lindex $argv 4]
-
-
#puts “Am citit:/n”;
-
#puts “user: $user”;
-
#puts “passw: $passw”;
-
#puts “host: $host”;
-
#puts “location: $location”;
-
#puts “file1: $file1”;
-
-
-
#check if all were provided
-
if { $user == “” || $passw == “” || $host == “” || $location == “” || $file1 == “” } {
-
puts “Usage: <user> <passw> <host> <location> <file1 to send>/n”
-
exit 1
-
}
-
-
#sftp to specified host and send the files
-
spawn sftp $user@$host
-
-
set rez [connect $passw]
-
if { $rez == 0 } {
-
send “cd $location/r”
-
set timeout -1
-
send “put $file1/r”
-
#send “ls -l/r”
-
#send “quit/r”
-
#send “mkdir testsftp/r”
-
send “quit/r”
-
expect eof
-
exit 0
-
}
-
puts “/nCMD_ERR: connecting to server: $host!/n”
-
exit 1
-
0
expect也可以用两种形式调用
1 ./my.exp $usr $pwd $host $local $file
2. 代码中直接插入
expect<<!
-