ググってみると、大抵以下のようなコードが多数見つかる。
ruby -e 'p [*1..9, *"a".."z", *"A".."Z"].sample(8).join'
これ、
ruby -e 'p [*"!".."z"].sample(8).join'
でいいんぢゃねぇです? 文字コード的に半角スペース, "!" , …数字…大文字アルファベット…小文字アルファベット、と続くので。まあパスワードに半角スペース入れると入力が厄介なことになりそうだからその次の "!" から始めるとして。
あ、でも " とか ' とか ` あたりもパスワードに含めると扱いがアレ気になりそうだから、
ruby -e 'p [*"!".."z"].reject {|c| %w"\" '"'"' \`".include? c }.sample(8).join'
くらいで、どうですかね?