windows/linux中shell自动登录ssh并执行一些命令

ssh安全的自动登录

A为本地主机(即用于控制其他主机的机器) ;
B为远程主机(即被控制的机器Server), 假如ip为172.24.253.2 ;
A和B的系统都是Linux

在A上的命令:

 代码如下 复制代码
# ssh-keygen -t rsa (连续三次回车,即在本地生成了公钥和私钥,不设置密码)
# ssh root@172.24.253.2 "mkdir .ssh;chmod 0700 .ssh" (需要输入密码)
# scp ~/.ssh/id_rsa.pub root@172.24.253.2:.ssh/id_rsa.pub (需要输入密码)

在B上的命令:

 代码如下 复制代码
# touch /root/.ssh/authorized_keys2 (如果已经存在这个文件, 跳过这条)
# cat /root/.ssh/id_rsa.pub  >> /root/.ssh/authorized_keys2 (将id_rsa.pub的内容追加到 authorized_keys2 中)

回到A机器:

 代码如下 复制代码
# ssh root@172.24.253.2 (不需要密码, 登录成功)

如果能保护好自己的私钥, 这种方法相对在shell上输入密码, 要安全一些

实例

任务描述:
使用shell脚本登录远程服务器,并执行命令:添加反向代理站点。Windows用户的方法见文末。

示例代码的功能:
登录远程linux服务器并在上边执行命令后返回当前linux主机,执行的命令为“在远程服务器上执行一个添加反向代理站点的命令”。添加站点需要知道域名,所以这个脚本有一个参数,这个参数就是域名。

示例代码的用法:

 代码如下 复制代码

 raps.sh xxxxx.com
raps.sh代码:

#!/usr/bin/expect
# 名称:Remote Add Proxy Site,^_^
# 说明:自动登上远程服务器后添加反向代理站点(配置内置)
# 注意:需要传递一个域名参数,脚本中的proxySiteAdd是远程服务器上的添加站点工具
# 用法:raps xxxx.com
# 2012-11-02 08:55:21
 
# 配置
set user upall
set passwd upall@remote
set server 158.164.198.210
set port 2222
set dn [lindex $argv 0]
 
# 登录并执行命令
spawn ssh $user@$server -p $port
expect "password:"
send "${passwd}n"
expect "]# "
send "proxySiteAdd ${dn}n"
expect "]# "
exit

补充:

1、“expect "]# "”用于接收终端输出,如果输出中有“]# ”标志就往下继续执行命令;send 用于在远程服务器上执行命令。

2、传递参数时不能直接使用“$1”、“$2”,“set dn [lindex $argv 0]”会把第0个参数赋值给$dn,若是“set dn [lindex $argv 2]”会把第3个参数赋值给$dn。

 代码如下 复制代码

#!/bin/bash
HTTPD_CONF="/etc/httpd/conf/vhosts.conf"
# 生成apache虚拟主机配置文件(反向代理)
echo "<VirtualHost *:80>">> $HTTPD_CONF
echo "        ServerName www.$1">> $HTTPD_CONF
echo "        ServerAlias $1">> $HTTPD_CONF
echo "        ProxyRequests Off">> $HTTPD_CONF
echo "        <Proxy *>">> $HTTPD_CONF
echo "                Order deny,allow">> $HTTPD_CONF
echo "                Allow from all">> $HTTPD_CONF
echo "        </Proxy>">> $HTTPD_CONF
echo "        ProxyPass / http://$1.demo.upall.cn/">> $HTTPD_CONF
echo "        ProxyPassReverse / http://$1.demo.upall.cn/">> $HTTPD_CONF
echo "</VirtualHost>">> $HTTPD_CONF
echo "CONF: "$HTTPD_CONF
#### 下边的代码是跳转用的,如果不想使用反向代理可以用下边的代码取代上边的
# 生成apache虚拟主机配置文件(跳转)
#echo "<VirtualHost *:80>">> $HTTPD_CONF
#echo " ServerName www.$1">> $HTTPD_CONF
#echo " ServerAlias $1">> $HTTPD_CONF
#echo " Redirect / http://$1.demo.upall.cn/">> $HTTPD_CONF
#echo "</VirtualHost>">> $HTTPD_CONF

Windows用户的解决办法

可以使用plink.exe实现这个功能,示例:

 代码如下 复制代码

1 plink -pw yourPassword root@123.123.123.123 -P 23 doSomething.sh

<完>

该功能会加到这个脚本这里:。

深入一点点:

从表面上简单的理解一下登录的过程,
首先 ssh-keygen -t rsa 命令生成了一个密钥和一个公钥, 而且密钥可以设置自己的密码
可以把密钥理解成一把钥匙, 公钥理解成这把钥匙对应的锁头,
把锁头(公钥)放到想要控制的server上, 锁住server, 只有拥有钥匙(密钥)的人, 才能打开锁头, 进入server并控制
而对于拥有这把钥匙的人, 必需得知道钥匙本身的密码,才能使用这把钥匙 (除非这把钥匙没设置密码), 这样就可以防止钥匙被了配了(私钥被人复制)

当然, 这种例子只是方便理解罢了,
拥有root密码的人当然是不会被锁住的, 而且不一定只有一把锁(公钥), 但如果任何一把锁, 被人用其对应的钥匙(私钥)打开了, server就可以被那个人控制了
所以说, 只要你曾经知道server的root密码, 并将有root身份的公钥放到上面, 就可以用这个公钥对应的私钥"打开" server, 再以root的身分登录, 即使现在root密码已经更改!

如果想控制n个机器, 那就需要n对钥匙(密钥和公钥), ssh-keygen 命令可以随意更改钥匙对的名字, 比如:

 代码如下 复制代码
[root@wwy .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa_192.168.102.12
......

这样私钥和公钥的名字分别就是:
id_rsa_192.168.102.12 和 id_rsa_192.168.102.12.pub
然后将 id_rsa_192.168.102.12.pub 文件的内容, 追加到sever的 ~/.ssh/authorized_keys2 文件中,

最后, 在本地用ssh命令的 -i 参数指定本地密钥, 并登录:
# ssh -i /root/.ssh/id_rsa_192.168.102.12 192.168.102.12

如果密钥设置了密码, 就用密钥的密码登录, 没设密码, 就直接登录进去了

scp也是一样的
如:
scp -i /root/.ssh/id_rsa  ./xxx 192.168.102.158:/home/wwy/bak

这种不需密码的不安全,下面看一个更安全的

首先生成一个新的ssh密钥对

 代码如下 复制代码

[guo@guo zuo]$ ssh-keygen -f id_ras -t rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_ras.
Your public key has been saved in id_ras.pub.
The key fingerprint is:
17:ca:c3:37:8f:60:86:42:d0:0d:b7:4d:70:a1:b2:a3 guo@guo
The key's randomart image is:
+--[ RSA 2048]----+
|  ...oo.+.       |
|   ....*         |
|    o o . .      |
|   . o + . .     |
|    + . S +      |
|   . o o = +     |
|  E       . .    |
|                 |
|                 |
+-----------------+

当程序询问密码时按【enter】键,表示不设密码,此时会在工作目录中产生私钥,密码文件名为is_rsa,以及公钥文件id_psa.pub。

[guo@guo zuo]$ ls id*

id_ras  id_ras.pub

接下来把一个公钥复制到远程主机

 代码如下 复制代码

[guo@guo zuo]$ ssh-copy-id root@222.24.21.61
root@222.24.21.61's password:
Now try logging into the machine, with "ssh 'root@222.24.21.61'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

这一次需要输入密码。但是以后就不用再输入密码了。

[guo@guo zuo]$ ssh-copy-id root@222.24.21.61
root@222.24.21.61's password:
Now try logging into the machine, with "ssh 'root@222.24.21.61'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

接下来执行脚本。

[guo@guo zuo]$ cat guossh.sh
#!/bin/sh
ssh root@222.24.21.61
[guo@guo zuo]$ sh guossh.sh
Last login: Sun Nov 13 20:28:30 2011 from 222.24.21.61
[root@guo ~]#

现在已经登录上了。

时间: 2024-10-08 09:06:38

windows/linux中shell自动登录ssh并执行一些命令的相关文章

LINUX中RSA认证登录SSH

  方法一, 有的时候经常需要登录ssh,每次都需要输入密码,会比较繁琐.所以设置了一下使用RSA公钥认证的方式登录Linux. 首先需要在服务器端设置/etc/ssh/sshd_config # vim /etc/ssh/sshd_config 修改如下两行为yes.其实大多数情况下不用修改,默认就是yes. RSAAuthentication yes PubkeyAuthentication yes (1) 如果客户机和服务器都是Linux机器,那么我们使用下面的方法:(后面第2节会提到怎么

LINUX中RSA认证登录SSH(不需要输入密码登录)2种方法

方法一, 有的时候经常需要登录ssh,每次都需要输入密码,会比较繁琐.所以设置了一下使用RSA公钥认证的方式登录Linux. 首先需要在服务器端设置/etc/ssh/sshd_config # vim /etc/ssh/sshd_config 修改如下两行为yes.其实大多数情况下不用修改,默认就是yes. RSAAuthentication yes PubkeyAuthentication yes (1) 如果客户机和服务器都是Linux机器,那么我们使用下面的方法:(后面第2节会提到怎么在W

linux中shell自动升级openssl到openssl 1.0.1g

系统:centos 5.x openssl升级脚本内容: cat openssl_update.sh  代码如下 复制代码 #!/bin/bash if [[ $EUID -ne 0 ]]; then    echo "This script must be run as root" 1>&2    exit 1 fi yum -y install glibc* cpp gcc* make zlib ntp wget ntpdate time.nist.gov hwclo

如何在Windows中启用自动登录

  本文介绍如何通过在注册表数据库中存储密码和其他相关信息,将 Windows 配置为自动执行登录过程.此功能允许其他用户启动您的计算机并使用您建立的帐户自动登录. 重要说明:如果启用自动登录,可以更方便地使用 Windows;但是,此功能可能会造成安全风险.如果将计算机设置为自动登录,则任何可以实际接触该计算机的人都可以访问其中的所有内容,包括它所连接到的任何网络内容.另外,如果启用自动登录,则密码将以纯文本形式存储在注册表中.Authenticated Users 组可以远程读取存储此值的特

Linux/Unix shell 自动 FTP 备份档案

       使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linux 下使用 shell 脚本来实现自动FTP备份档案.        Linux Shell以及导入导出的相关参考:        Linux/Unix shell 脚本中调用SQL,RMAN脚本        Linux/Unix shell sql 之间传递变量        Li

Linux/Unix shell 自动导入Oracle数据库

      使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linux 下使用 shell 脚本来实现自动导入Oracle数据库.        Linux Shell以及导入导出的相关参考:        Linux/Unix shell 脚本中调用SQL,RMAN脚本        Linux/Unix shell sql 之间传递变量       

在Windows Vista中使用经典登录界面

对于习惯了使用Windows 2000 与 Windows XP 经典登录方式--登录时需要输入用户名与密码--的用户而言,可能会感到Windows Vista中使用欢迎屏幕登录的方式有点别扭,而且,与Windows XP不同的是,在Windows XP中,用户可以直接修改登录方式, 从欢迎屏幕登录切换到经典登录方式,而在Windows Vista中则没有相应的选项,用户默认只能使用欢迎屏幕登录.(注:除非Windows Vista作为域成员,在连接到域时会提供经典登录界面 .) 当然,如果您仍

应用-Linux中shell脚本问题

问题描述 Linux中shell脚本问题 ]我有shell脚本,放在/bin/目录下,内容如下: #!/bin/sh cd /usr /sbin/insmod s3c_ts.ko ./digitpic ./MSYH.TTF & 当我开发板上电以后我手动执行手动执行test.sh 我的digitpic应用程序能够正常启动 当我在/etc/init.d/rcS 文本里面最后添加exec test.sh 提示说这个触摸屏读取错误,也就是/sbin/insmod s3c_ts.ko这部分错误了,就只有触

redis-WEB项目登录模块中的自动登录功能如何实现检查cookies是否过期

问题描述 WEB项目登录模块中的自动登录功能如何实现检查cookies是否过期 private void setLoginRedis(HashCommands commands,Object key, Object hashKey, Object value) { commands.put(RedisBusinessCode.WEB_LOGIN_LIM.getCode(), key, hashKey, value); //保存到redise commands.expire(RedisBusine