linux中ssh如何远程执行一条命令,而且不登录远程服务器?

linux中ssh如何远程执行一条命令,而且不登录远程服务器?,第1张

一 SSH命令使用技巧 - 远程登录

ssh [email protected]

- 远程执行

ssh [email protected] 'command ...'

- 远程复制

scp [email protected]:/remote/path /local/path

scp /local/path [email protected]:/remote/path

- X forward

ssh -X [email protected]

xcommand ...

- Tunnel / Portforward

ssh -L 1234:remote.machine:4321 [email protected]

ssh -R 1234:local.machine:4321 [email protected]

ssh -L 1234:other.machine:4321 [email protected]

二, 实作 1) 禁止 root 登录

# vi /etc/ssh/sshd_config

PermitRootLogin no

2) 废除密码登录, 强迫使用 RSA 验证(假设 ssh 账户为 user1 )

# vi /etc/ssh/sshd_config

RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

PasswordAuthentication no

# service sshd restart

# su - user1

$ mkdir ~/.ssh 2>/dev/null

$ chmod 700 ~/.ssh

$ touch ~/.ssh/authorized_keys

$ chmod 644 ~/.ssh/authorized_keys

登入 端:

$ ssh-keygen -t rsa

(按三下 enter 完成﹔不需设密码,除非您会用 ssh-agent 。)

$ scp ~/.ssh/id_rsa.pub [email protected]:id_rsa.pub

(若是 windows client, 可用 puttygen.exe 产生 public key,

然后复制到 server 端后修改之, 使其内容成为单一一行.)

回到 server 端:

$ cat ~/id_rsa.pub >>~/.ssh/authorized_keys

$ rm ~/id_rsa.pub

$ exit

3) 限制 su / sudo 名单:

# vi /etc/pam.d/su

auth required /lib/security/$ISA/pam_wheel.so use_uid

# visudo

%wheel ALL=(ALL) ALL

# gpasswd -a user1 wheel

4) 限制 ssh 使用者名单

# vi /etc/pam.d/sshd

auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users ōnerr=fail

# echo user1 >>/etc/ssh_users

最近在编写脚本的时候发现一个问题,在执行 kubectl -n kube-system get pods 这个命令的时候,通过 ssh root@ip command 和 ssh root@ip command 登录后执行得到了不同的结果,

从上面可以看到SSH远程执行获取pods失败了,但是shell窗口执行却成功了,所以我们可以猜到两者之间一定有什么区别导致结果的不同。那么区别在哪里呢?通过研究发现两者的环境变量存在区别,通过执行printenv可以查看所有设置的环境变量:

通过上面可以看到SSH远程执行的时候是没有KUBECONFIG这个环境变量,而Shell窗口是有的,为什么有这个区别呢?这就要从Linux的bash的四种模式说起。

bash的四种模式:

从上面可以看出不同方式下加载的配置文件不同,那么怎么知道我们是加载了那些配置文件呢? 这里有一个验证的方法,就是在上面的每个配置文件中添加一句 echo $/etc/profile 这样的命令,把每个文件的路径打印出来。当配置文件被加载时,会输出相应的文件名,本例中在两个文件中加了该命令:/etc/pfoile, ~/.bashrc,然后使用不同SSH方式执行命令的结果如下。

只加载了.bashrc文件,未加载/etc/profile。

从输出可以看到两个配置都加载了,而KUBECONFIG只定义在/etc/profile中,没有定义在.bashrc文件中,所以通过 ssh root@ip command 执行时没有拿到KUBECONFIG这个环境变量从而导致报错。知道原因后我们就可以将KUBECONFIG环境变量添加到.bashrc文件即可。

指定一台主机作为信任主机,这样从这台主机登录其他机器就不需要密码了。设置信任主机: 假设有四台机器:192.168.2.1~192.168.2.4,其中192.168.2.1为信任机,那么在192.168.2.1上运行如下命令: $.sh-keygen -t rsa //此处一路回车,生成秘钥 $scp .ssh/id_rsa.pub 192.168.2.2:~/ //把秘钥拷贝到其他远程机器 $ssh 192.168.2.2 ‘cat id_rsa.pub >>.ssh/authorized_keys’ //(远程执行命令)在远程机器上生成认证文件 经过这几步,从192.168.2.1 ssh登陆192.168.2.2时,就不会再需要输入密码了。同样的步骤再执行3、4的极其。 文本文件hostlist可以如下 192.168.2.2 192.168.2.3 192.168.2.4 #!/bin/shdoCommand(){     hosts=`sed -n'/^[^#]/p'hostlist` for   host  in   $hosts do echo "" echo  HOST$host ssh  $host  "$@"  done return 0 } if  [  $# -lt 1 ] then echo "$0cmd" exit  fi do  Command "$@" echo "return from doCommand" 执行命令(记得先对doCommand.s h增加执行权限 chmod u+x doCommand.sh) ./doCommand.sh “ls -al /root/” 这样该脚本就会在每台机器上执行”ls -al /root/”这个命令,并返回结果在信任主机上。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8705447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存