hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

sshpassコマンドの使い方



1 sshpassコマンドとは?

sshコマンドのパスワードを手動ではなく、あらかじめ決めた方法で入力するコマンドです。

2 検証環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のens33はNICの名前です。

                               192.168.2.0/24
client(ens33) ------------------------------------------(ens33) server
        .105                                           .100

2.2 版数

CentOS版数は、サーバ、クライアントともに下記版数です。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname  -r
3.10.0-1160.el7.x86_64

3 インストール方法

クライアントからサーバにsshログインするので、クライアントにsshpassパッケージをインストールします。

[root@client ~]# yum -y install sshpass

sshpassの版数を確認します。

[root@client ~]# sshpass -V
sshpass 1.06
(C) 2006-2011 Lingnu Open Source Consulting Ltd.
(C) 2015-2016 Shachar Shemesh
This program is free software, and can be distributed under the terms of the GPL
See the COPYING file for more information.

Using "assword" as the default password prompt indicator.

4 オプション一覧

オプションは以下のとおりです。

[root@client ~]# sshpass -h
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
   -f filename   Take password to use from file
   -d number     Use number as file descriptor for getting password
   -p password   Provide password as argument (security unwise)
   -e            Password is passed as env-var "SSHPASS"
   With no parameters - password will be taken from stdin

   -P prompt     Which string should sshpass search for to detect a password prompt
   -v            Be verbose about what you're doing
   -h            Show help (this screen)
   -V            Print version information
At most one of -f, -d, -p or -e should be used

5 事前準備

クライアントからサーバにuser1でログインするため、サーバでテスト用のユーザを作成します。

[root@server ~]# useradd user1

作成したユーザを確認します。

[root@server ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1)

パスワードは11111を設定します。

[root@server ~]# passwd user1
ユーザー user1 のパスワードを変更。
新しいパスワード:
よくないパスワード: このパスワードは回文です。
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

6 パスワードをパラメータに指定する方法(初回)

クライアントからサーバに初めてログインするとき、フィンガープリントが表示されます。フィンガープリントとは、サーバの公開鍵をハッシュ関数でハッシュした値です。クライアントは、この値を確認することで、今まで接続したことのあるサーバと同じサーバかどうかを判断します。つまり、サーバのなりすましを防ぐため、フィンガープリントを確認することになります。

以下はそれぞれ、サーバのECDSA公開鍵をSHA256でハッシュしたフィンガープリント、MD5でハッシュしたフィンガープリントです。

[root@client ~]# ssh 192.168.2.100
The authenticity of host '192.168.2.100 (192.168.2.100)' can't be established.
ECDSA key fingerprint is SHA256:MO3c6GLWVMNHoSuUrJ6ub+FwwrinAHrR4rVo0x7tUYE.
ECDSA key fingerprint is MD5:58:ab:e2:e5:97:22:ec:e5:bc:1d:b1:a1:e3:d3:0c:77.
Are you sure you want to continue connecting (yes/no)?

known_hostsファイルを確認します。192.168.2.100のフィンガープリントが格納されていないので、クライアントはまだサーバにsshログインしていないことになります。

[root@client ~]# cat .ssh/known_hosts
[root@client ~]#

はじめてサーバにsshログインする場合、sshのオプションに"StrictHostKeyChecking=no"を指定して、フィンガープリントが期待したものかどうかの手動確認する処理をスキップしてみます。

[root@client ~]# sshpass -p 11111 ssh -o StrictHostKeyChecking=no -l user1 192.168.2.100
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
Last login: Wed Mar  2 19:46:59 2022 from 192.168.2.105
[user1@server ~]$

サーバにsshログインすると、サーバのフィンガープリントがknown_hostsに保存されます。

[root@client ~]# cat .ssh/known_hosts
192.168.2.100 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBdl9A10lduRRoWxudEWamirUaqKArhQ3ZbROP1EJ4l/RWZEPtYqw8WU1NfYCDJQwYuA4yUM/Xj9G6tGk29UB8s=

7 パスワードをパラメータに指定する方法(2回目以降)

2回目以降は、サーバのフィンガープリントがknown_hostsに保存されているので、sshのStrictHostKeyCheckingオプションを使う必要はありません。sshpassコマンドの-pオプションでパスワードを指定して、クライアントからサーバにsshログインします。

[root@client ~]# sshpass -p 11111 ssh -l user1 192.168.2.100
Last login: Wed Mar  2 19:10:39 2022 from 192.168.2.105
[user1@server ~]$

8 ファイルを使う方法(-f)

パスワードを格納したファイルを作成します。

[root@client ~]# vi passwd.txt
[root@client ~]# cat passwd.txt
11111

クライアントからサーバにsshログインします。

[root@client ~]# sshpass -f passwd.txt ssh -l user1 192.168.2.100
Last login: Wed Mar  2 19:11:11 2022 from 192.168.2.105
[user1@server ~]$

9 環境変数を使う方法(SSHPASS)

環境変数にパスワードを設定します。

[root@client ~]# export SSHPASS=11111

設定した環境変数を確認します。

[root@client ~]# echo $SSHPASS
11111

クライアントからサーバにsshログインします。

[root@client ~]# sshpass -e ssh -l user1 192.168.2.100
Last login: Wed Mar  2 19:16:42 2022 from 192.168.2.105
[user1@server ~]$

10 scpコマンドへの応用

クライアントからサーバにscpコマンドでファイル転送をしてみます。このとき、scpへの手動のパスワード入力処理をスキップしてみます。

[root@client ~]# echo 11111 > hoge.txt
[root@client ~]# cat hoge.txt
11111

sshpassコマンドを使って、クライアントからサーバにファイルを転送します。

[root@client ~]# sshpass -p 11111 scp hoge.txt user1@192.168.2.100:/home/user1

クライアントからサーバに転送したファイルの中身を確認します。

[user1@server ~]$ cat hoge.txt
11111

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ