夜里醒来,两点多钟,上了一下网,本来可以继续休息的,偏偏遇到一个问题,搞的一夜没再睡觉。
呜呼!身体要紧!
使用双机认证机制免除scp、ssh登录密码输入,这个问题并不算什么难题,但第一次接触还是相当麻烦。这就是IT业的原罪。
如果每次进行scp或ssh时都要输入密码,真是烦到死。当然,进一步,可以编程实施自动数据传递,更为方便。
为了解决这个问题,在网上查了一大堆资料,翻了一大堆书,比如DanielJ等的《SSH权威指南》,等等。都是讲了很多,并且很多内容也很好,就是关键点讲不透,或是坚决不讲透,不断在关键点的周围迂回,结果我调试了多次都行不通。
使用scp或rsync来进行远程无密码传输数据,要解决两台服务器的认证,可以以下操作:
我们假设使用客户机与服务器连接,服务器的IP是:123.456.789.8。
1)
首先在客户机上以root用户执行以下命令:
#ssh-keygen -t rsa
然后一直回车。
这时,会在/root/.ssh/下生成id_rsa和id_rsa.pub两个文件,其中id_rsa是密钥,id_rsa.pub是公钥。
你可以进入该目录查看这两个文件是否生成:
#cd /root/.ssh/
肯定已经生成。
在以上生成文件的过程中,系统会提示你输入密码,你可以随便处理。
2)
然后把id_rsa.pub拷贝到服务器的/root/.ssh/下,并更名为authorized_keys:
#scp /root/.ssh/id_rsa.pub123.456.789.8:/root/.ssh/authorized_keys
如果你顺利地完成了这一步,算你幸运。多数情况肯定是服务器上就没有这个目录/root/.ssh。
为了简单,你干脆登录到服务器,把第一阶段的操作重复一遍:
#ssh-keygen -t rsa
猛按回车。
如果你还是吃饱撑的没事干,可以进入服务器的/root/.ssh/,把id_rsa和id_rsa.pub两个文件删除。
现在回到客户机,再拷贝上述文件,定是万无一失了。
3)
为了权限问题,最好再进入服务器,进行下面操作:
# chmod 700 ~/
# chmod 700 ~/.ssh
# chmod 600~/.ssh/authorized_keys
不过这一步大可不必。
不过这一步大可不必。
4)
再回到客户机。执行:
#ssh-add
按提示要求输入密码。
以上全部工作完成。
现在,从客户机进行ssh连接:
#ssh 10.61.210.8
不需要输入密码即可登录。
当然,这里的IP是假设的,你可以换成你的真实主机名就可以了。
当然,这里的IP是假设的,你可以换成你的真实主机名就可以了。
scp 也是一样的。
同样的可以对多台服务器操作。
下面通过程序自动传输数据。
源代码:
test.cpp
#include
#include
#include
#include
usingnamespace std;
voidtryScp(char* ask)
{
//write:
ofstream ofs("/home/liren/Hello",ios::out|ios::trunc|ios::binary);
if( !ofs ){
cerr << "Poor thing !"<< endl;
exit(1);
}
ofs<< ask<< endl;
ofs.close();
return;
}
int main()
{
tryScp("Happy New Year !");
system("scp /home/liren/Hello123.456.789.8:/home/");
system("scp 123.456.789.8:/home/Hello /home/");
exit(0);
}
编译运行。
可以在相应目录看到传递的文件。
成功。
同样的可以对多台服务器操作。
下面通过程序自动传输数据。
源代码:
test.cpp
#include
#include
#include
#include
usingnamespace std;
voidtryScp(char* ask)
{
//write:
ofstream ofs("/home/liren/Hello",ios::out|ios::trunc|ios::binary);
if( !ofs ){
cerr << "Poor thing !"<< endl;
exit(1);
}
ofs<< ask<< endl;
ofs.close();
return;
}
int main()
{
tryScp("Happy New Year !");
system("scp /home/liren/Hello123.456.789.8:/home/");
system("scp 123.456.789.8:/home/Hello /home/");
exit(0);
}
编译运行。
可以在相应目录看到传递的文件。
成功。
祝你好运!