打通两台机器的ssh
在分布式应用之中经常要将两台机器的命令打通,需要在A机器上触发B机器上的某条命令,比如,在做svn的主从同步服务过程中,需要在A机器上触发B机器上的 svn up /var/www/html 命令,在A机器上可以这样执行:
ssh 10.2.3.34 "svn up /var/www/html" 这条命令在控制台中执行的话会提示您需要输入B机器上的用户名密码,才能正常执行。问题是,如果要将这条命令写道shell 文件中,在执行过程中没有机会让你去输入用户信息。
这样就需要事先在AB两台机器之间建立信任机制。
打通两台服务器的SSH的方法简单,只要执行以下步骤就行了:
1 假设都是用root用户,在A机器上cd /root/.ssh 然后执行命令ssh-keygen命令,
控制台会打印出以下提示,都敲击回车就行了
Enter file in which to save the key (/home/svnsync/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:
然后会在目录下产生一个新的公钥文件 id_rsa.pub,打开该公钥文件,将里面的内容拷贝下来
如果之前你使用的 adduser svnsync(此应该为受控机)为系统添加了一个专门做svn同步的用户帐户,此时需要先执行以下
su - svnsync,然后执行以下 ssh 123.123.123.123 (ip随便好了),之后就 cd /home/svnsync/.ssh
2 打开B服务器的 /root/.ssh目录,(假设当前登录的用户是 root用户)vi authorized_keys 该文件,将光标移动到文件最后一行,将剪贴板中的内容添加到文件的结尾。
注意:authorized_keys 这个文件需要有执行权限,执行chmod 700 authorized_keys 就行了
3最后在A 上执行ssh 10.2.3.34 "svn up /var/www/html"敲击回车之后,会显示确认对话框,输入“yes”就ok了
注:默认情况下 用户的 当前目录都会在 /home/目录下,例如:/home/baisui /home/user2 等,也有不是这个目录下的,比如:在服务器上安装了tomcat5,tomcat5的拥有者为tomcat用户,但是在/home 目录下没有该用户的文件夹,但是可以用过执行 “sudo vi /etc/passwd” 这个命令来查看:
tomcat:x:91:91:Tomcat:/usr/share/tomcat5:/bin/sh
有这么一条,说明tomcat的当前目录是 /usr/share/tomcat5 这个目录
另外,如果当前你没有root权限,如果要执行一些自动化的批处理,需要手工输入的话可以考虑使用 expect命令,可以帮你事半功倍,http://www.pythonclub.org/linux/expect http://www.tcl.tk/man/expect5.31/expect.1.html
以下这段代码可以在 远端服务器上的/home/yunjiu.llh 目录下创建一个tmp目录
#!/usr/bin/expect set timeout 30 #spawn ssh 172.24.157.108 expect -d<<EOF spawn ssh -l yunjiu.llh 172.24.157.104 expect "*assword*" send "123456\r" expect "*]*" #sleep 3 send "mkdir /home/yunjiu.llh/tmp\r" expect "*]*" exit
一个远程执行ssh 环境变量的问题:
执行如下代码:~/myscript.sh: line n: app: command not found,不能正常执行
显然在远程编辑 /etc/profile 文件没有效果,而是要 去编辑
vim /etc/bashrc,在文件最后export上环境变量
http://feihu.me/blog/2014/env-problem-when-ssh-executing-command-on-remote/