40081
posix 規格に対してポータブルな、パスワード生成シェルスクリプトはどのようなものになりますか?
パスワードは、ひとまずアルファベット(大文字・小文字)+数字で生成できればいいと考えています。
CC BY-SA 3.0
2017-12-06T00:40:11.707
40068
2017-12-06T07:09:32.077
754
question
shellscript posix
posix システムにてパスワードを生成するには?
Perlスクリプトにはなりますが、こんなコードを使用しています。

```

    #!/usr/bin/perl
    
    $passwd_char = '1234567890' . 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . 'abcdefghijklmnopqrstuvwxyz';
    $len = 8;
    $passwd = "";
    $size = length($passwd_char);
    for($n = 0; $n < $len; $n++) {
      $passwd .= substr($passwd_char, int(rand($size)), 1);
    }
    print "$passwd\n";
    
```
CC BY-SA 3.0
2017-12-06T01:07:54.587
40070
2017-12-06T01:07:54.587
3060
40068
answer
`/dev/urandom` を利用するのが手っ取り早いかと思います。

```

    #!/bin/sh
    # Usage: ./mkpassword.sh [SET] [LENGTH]
    
    SET=${1:-"A-Z-a-z0-9"}
    LENGTH=${2:-32}
    tr -dc "$SET" < /dev/urandom | head --bytes "$LENGTH"
    echo
    
```

使用例

```

    $ ./mkpassword.sh
    PQ8gRtyfQ7lo2OL7ftqpkdKZXV3kSaej
    
```
CC BY-SA 3.0
2017-12-06T03:53:40.830
40073
2017-12-06T03:53:40.830
2391
40068
answer
乱数の生成には `awk` の `rand()` が使えます。  
ただ、種の決定をどうするのがよいのか、自信がないです。  
[Directory Structure and
Devices](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap10.html)
に `/dev/urandom`
は無いですし、[date](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html)コマンドでナノ秒などを取得することもできないようです。  
とりあえず以下では、秒までの時間とプロセスIDを使っています。

```

    #!/bin/sh
    seed=$(( $(date +%y%j%H%M%S) + $$))
    
    awk -v seed="$seed" -f - <<__AWK__
    BEGIN{
        len = 20
        chars = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    
        srand(seed)
        chars_num = length(chars)
        for (i=0; i<len; ++i) {
            c = int(rand() * chars_num) + 1
            printf("%s", substr(chars, c, 1))
        }
        printf("\n")
    }
    __AWK__
    
```
CC BY-SA 3.0
2017-12-06T07:09:32.077
40081
2017-12-06T07:09:32.077
3054
40068
answer