TTSSHのssh2秘密鍵ファイル指定時にエラー
To 報告してくださった方
"Teratermマクロから以下の指定を行う" とは、どのようにマクロファイルを実行したのでしょうか。
を試しましたが、私の手元ではどれも再現しませんでした。
'myserver /ssh /2 /auth=publickey /user=username /passwd=password /keyfile=private-key-file' の内容を全部 Tera Term の新規接続ダイアログの Host のところに入力して接続しても同じですか?
起動した画面上では「RSA/DSA/ECDSA/ED25519鍵を使う」のラジオボタンが選択されていますが、「秘密鍵(K)」が無効となっています。
ログインに必要な情報がすべて与えられている(それでログインが成功するかどうかは別です)はずの状態では、ユーザがファイルを指定し直す必要が無いので無効にしているようです。cf. https://osdn.net/projects/ttssh2/svn/view?view=revision&root=ttssh2&revision=2784
To 開発メンバー
で再現しませんでした。みなさんのところでは再現するでしょうか?
このような現象になる条件はあるでしょうか?
SSH Authentication のダイアログにて
Authentication methods で "Use RSA/DSA/ECDSA/ED25519 key to log in" を選び
Private key file の選択ボタンを押して
Choose a file with the RSA/DSA/ESCDSA/ED25519 のファイル選択ダイアログを出した時、
ファイル名「identity」の横のファイル種別?の「identity files」部分が
4.106 だと 各種いろいろあるのに対し、
5. だと identity files しか無いので鍵ファイルを選択することができない、
…ということではないでしょうか?
もしそうだとすると、 5.xxx でもファイル名「identity」を「*.*」にして enter するとファイルが選べるようになるみたいです。
私の環境では「identity files しか無い」は再現しませんでした。
r10638 のスナップショット zip を展開して そのまま ttermpro.exe をダブルクリック実行しています。 何か他にも条件がありそうですね。
beta1 (r10612) で再現せず、teraterm-5.0-dev-r10638-20230313-appveyor.zip で再現しました。
この件は #47602 に移動します。
引数で受けとった秘密鍵ファイル名は OpenFileName() を経由せずにエディットコントロールにセットされ、接続時にエディットコントロールから(Disabledでも)読み取られるため、OpenFileName() のフィルタの件は、秘密鍵でログインできない件との関係は薄いと推測します。
そのまま ttermpro.exe をダブルクリック実行しています。
これは「秘密鍵でのログイン」のことですか?「ttermpro.exe をダブルクリックして、マクロファイルを選択」ですか?
「そのまま ttermpro.exe をダブルクリック実行している」は、「identity files しか無い(画像)」に至る操作の補足のつもりでした。
元投稿の記載の意図がわからず推測でコメントしてしまってすみません。 r9864 では問題なさそうなので、本件とは違いそうですね。
元投稿者さんからの追加情報を待とうと思います。
投稿者です。コメントありがとうございます。 r10644で試してみましたが同じでした。他のPCでも発生していたので環境の問題ではないと思っていたのですが、アプリケーション類が何か影響しているかもしれないですね。
「RSA/DSA/ECDSA/ED25519鍵を使う」が選択されているのに「秘密鍵(K)」が無効で、「rhosts(SSH1)を使う」のオプション(ローカルのユーザー名/ホスト鍵)が有効化という矛盾状態というのが多分文字だと伝わりにくいですね。 画面アップロードしておきました。
マクロを以下のようにすると、類似した状況になるようです。
connect 'myserver /ssh /2 /auth=publickey /user=username /passwd=password /keyfile='
ryo_k への返信
「RSA/DSA/ECDSA/ED25519鍵を使う」が選択されているのに「秘密鍵(K)」が無効で、「rhosts(SSH1)を使う」のオプション(ローカルのユーザー名/ホスト鍵)が有効化という矛盾状態というのが多分文字だと伝わりにくいですね。
説明ありがとうございます。十分理解しています。
ログインに必要な情報がすべて与えられている(それでログインが成功するかどうかは別です)はずの状態では、ユーザがファイルを指定し直す必要が無いので無効にしているようです。cf. https://osdn.net/projects/ttssh2/svn/view?view=revision&root=ttssh2&revision=2784
指定された認証方式が公開鍵認証のときに、公開鍵認証で指定する可能性があるコントロールだけ無効にしており、そのように見えます。
しかし、それはログインに成功する私の環境でも起きていますので、ログインできない件とは関係ない、と判断しています。
ところで、添付のスクリーンショットを見ると、コマンドラインで指定されたはずの秘密鍵ファイルとパスフレーズがダイアログに反映されていないようです。
1. myserver /ssh /2 /ask4passwd /auth=publickey /user=username /passwd=password /keyfile=private-key-file 2. myserver /ssh /2 /ask4passwd /auth=publickey /user=username /passwd=password 3. myserver /ssh /2 /ask4passwd /auth=publickey /user=username /keyfile=private-key-fileとするとログインに進まず認証ダイアログで止まるはずなのですが、そのときにパスフレーズ・秘密鍵ファイルが認証ダイアログにセットされるか確認できるでしょうか?
また、private-key-file にスペースなどが含まれているとしたら、秘密鍵ファイルを"(ダブルクォート)でくくっていますか?
Reply To nmaya
ログインに必要な情報がすべて与えられている(それでログインが成功するかどうかは別です)はずの状態では、ユーザがファイルを指定し直す必要が無いので無効にしているようです。cf. https://osdn.net/projects/ttssh2/svn/view?view=revision&root=ttssh2&revision=2784
指定された認証方式が公開鍵認証のときに、公開鍵認証で指定する可能性があるコントロールだけ無効にしており、そのように見えます。
確認ありがとうございます。動作としては通常の動作としてあり得るということは承知しました。 SSH1を指定していないのにSSH1の指定キーが有効されている時点で動作不良に見えましたので、その点を指摘しておりました。 スクリーンショットを見ると、GUI操作時ではラジオボタンが鍵指定を選択しており、通常無効化されるはずのSSH1のオプションが有効化されていることがわかるかと思います。(ご理解はされていると思いますが、なぜ言及していたかという点の話です)
しかし、それはログインに成功する私の環境でも起きていますので、ログインできない件とは関係ない、と判断しています。 ところで、添付のスクリーンショットを見ると、コマンドラインで指定されたはずの秘密鍵ファイルとパスフレーズがダイアログに反映されていないようです。
スクリーンショットについてはパスフレーズなしのパターンのものでアップしていました。 マルチバイト含めたパターンでいくつか試してみます。
また、private-key-file にスペースなどが含まれているとしたら、秘密鍵ファイルを"(ダブルクォート)でくくっていますか?
はい、前回書いていますが、前提として同じマクロファイル(およびINIファイル)で文字コードをSJISにしたものでTeraterm4ではログイン可能です。
4 と 5 で、パス名に日本語が含まれている場合の扱いに違いがあるようですね。
パスを SJIS で 0x5c を含む名称(例えば「性能一覧」)にしたら事象再現できました。
パスを「あああ」にしたら r10644 でクラッシュしました。
connect 'myserver /ssh /2 /auth=publickey /user=username /passwd=hogehgoe /keyfile=C:\あああ\id_rsa'
(匿名) への返信
connect 'myserver /ssh /2 /auth=publickey /user=username /passwd=hogehgoe /keyfile=C:\あああ\id_rsa'
検証ありがとうございます。再現しました。
To 松尾さん
引数 wchar_t option を char の pvar->ssh2_keyfile に _snprintf_s しているところで問題がおきているようです。ASCII文字だけだと問題はおきません。
「r9436で型を変更した変数」を同じように扱っているところすべてに影響があるかもしれません。
文字変換の部分を修正しました。(r10646)
https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10646-20230327-appveyor.zip
そのままでもsetlocale()していればうまく動いていましたが(参考 ticket #46476)、 より安全な専用の変換関数を使うようにしました。
sprintf()系 + "%ls" or "%S" でUnicodeを変換している箇所は他にはないと思います。
ファイル名に日本語が含まれている場合は直ったと思います。
修正ありがとうございます。引数が認証ダイアログに反映されるようになりました。
2023-03-27 01:53 のマクロで、「C:\あああ\id_rsa」はあらかじめ配置しておいて、以下のような状況です。
Windows10 22H2 です。文字化け画面とクラッシュ画面を添付します。
Reply To zmatsuo
文字変換の部分を修正しました。(r10646) https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10646-20230327-appveyor.zip
対応ありがとうございます。 以下のような形でマクロを組んでいますが、DesktopのパスにあるWindowsのユーザー名部分が文字化けしています(Windowsユーザー名がマルチバイトです)。
追加で参考になれば幸いです。 Windows11 22H2です。
getspecialfolder USERDESKTOP "Desktop" HOSTADDR = 'IP or Host' USERNAME = 'UserName' PASSWORD = '' strconcat INITFILE USERDESKTOP strconcat INITFILE '\teraterm\teraterm.INI' strconcat KEY_FILE USERDESKTOP strconcat KEY_FILE '\teraterm\teraterm.key' ;============================================== COMMAND = HOSTADDR strconcat COMMAND ':22 /ssh /2 /auth=publickey /user=' strconcat COMMAND USERNAME strconcat COMMAND ' /keyfile=' strconcat COMMAND KEY_FILE ;strconcat COMMAND ' /passwd=' ;strconcat COMMAND PASSWORD strconcat COMMAND ' /F=' strconcat COMMAND INITFILE connect COMMAND
追加情報です。
「ベータ: ワールドワイド言語サポートでUnicode UTF-8を使用」を有効にするとうまくいくようです。
確認ありがとうございます。
nmaya への返信
修正ありがとうございます。引数が認証ダイアログに反映されるようになりました。
ここで確認したのは「新規接続ダイアログのHost」に渡した /keyfile= 引数のことでした。
sempreff への返信
* ttpmacro.exe をダブルクリック → マクロファイルを指定 → read error SSH2 private key file No such file or directory(ファイル名は文字化け) * ttermpro.exe をダブルクリック → Tera Term: New connection をキャンセル → Control > Macro → マクロファイルを指定 → クラッシュ
ryo_k への返信
以下のような形でマクロを組んでいますが、DesktopのパスにあるWindowsのユーザー名部分が文字化けしています(Windowsユーザー名がマルチバイトです)。
マクロの connect コマンドから起動した Tera Term では文字化けするのを確認しました。
私個人の利用時は日本語のパスを使わないので、問題を認識できて助かります。
To 松尾さん
ttl ファイルが Shift_JIS でも UTF-8(BOM) でも文字化けするようです。
ざっと見た感じ TTLConnect() の中で GetStrVal() で connect コマンドの 引数を受け取ったところで化けているように見えます。マクロファイルの文字コードは自動判定されるようになっていた気がしますが、そのあたりでしょうか?
修正しました。r10649です。
https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10649-20230329-appveyor.zip
ざっと見た感じ TTLConnect() の中で GetStrVal() で connect コマンドの 引数を受け取ったところで化けているように見えます。
ttpmacro.exe の中では、マクロの文字列の char * は UTF-8 になっています。
GetStrVal() で取ってきた Str をそのまま見ようとすると、 (SJISと解釈しているので)無効な文字列になってしまいます。 クイックウオッチ(右クリック+Q)やイミディエイトウィンドウで、 「Str,s8」とやるとUTF-8の文字列を見ることができます。
UTF-8なのに、char(ACP)でコマンドラインを作って、ANSI(非Unicode)APIの WinExec() に渡していましたので文字化けしていました。
「ベータ: ワールドワイド言語サポートでUnicode UTF-8を使用」を有効にするとうまくいくようです。
うまくいくのは WinExec() が受け取る文字列がSJISではなくUTF-8のつもりになるからですね。なので
Windowsユーザー名がマルチバイト
もうまくいっているようです(裏取っていません)。
ソース確認したところ、getspecialfolder の扱いも UTF-8 になっています。
大丈夫だと思います。
r10649 で、1つ解消しました。
(条件を変えず、引き続き同じ 2023-03-27 01:53 のマクロで動作を確認しています)
zmatsuo への返信
GetStrVal() で取ってきた Str をそのまま見ようとすると、 (SJISと解釈しているので)無効な文字列になってしまいます。 クイックウオッチ(右クリック+Q)やイミディエイトウィンドウで、 「Str,s8」とやるとUTF-8の文字列を見ることができます。
UTF-8なのに、char(ACP)でコマンドラインを作って、ANSI(非Unicode)APIの WinExec() に渡していましたので文字化けしていました。
組み立てのほうでしたか、了解です。
sempreff への返信
* ttermpro.exe をダブルクリック → Tera Term: New connection をキャンセル → Control > Macro → マクロファイルを指定 → クラッシュ(事象変わらず)
もしかして、ttdde.c の RunMacro() の中で「日本語をパスに含む ttl ファイルを引数にして ttpmacro を起動する」で同じようなことがおきているでしょうか?
手もとで発生するのを確認しました。
ttpmacroとttermpro間の通信は、UTF-8文字列が妥当だと思います。
しかし、ANSI文字列として受け取っているところがありました。(ttdde.c の case CmdConnect: あたり)
これ以外にも不具合があるようです。 もう少し時間ください。
ttdde.c の RunMacro() の中で「日本語をパスに含む ttl ファイルを引数にして ttpmacro を起動する」で同じようなことがおきているでしょうか?
起きていました。失礼しました。
ttermpro.exe をダブルクリック → Tera Term: New connection をキャンセル → Control > Macro → マクロファイルを指定 → クラッシュ(事象変わらず)
直ったと思います。
UTF-8で処理するよう修正しました。r10650です。
https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10650-20230331-appveyor.zip
これ以外にも不具合があるようです。
発生する条件がレアなので(cmakeビルドで SUPPORT_OLD_WINDOWS=ON のとき)いまのところ問題ありません。
このチケットが一段落したら直そうと思います。
teraterm-5.0-dev-r10650-20230331-appveyor.zip
私の所では大丈夫そうです。
sempreff への返信
* ttermpro.exe をダブルクリック → Tera Term: New connection をキャンセル → Control > Macro → マクロファイルを指定 → クラッシュ(事象変わらず)
(条件を変えず、引き続き同じ 2023-03-27 01:53 のマクロで動作を確認しています)
この環境ではいかがでしょうか?
推測して直してもらったのと別のところで起きているかもしれないので、確認していただけると助かります。
発生する条件がレアなので(cmakeビルドで SUPPORT_OLD_WINDOWS=ON のとき)いまのところ問題ありません。 このチケットが一段落したら直そうと思います。
気づいたところは直しました(r10665)。
https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10665-20230406-appveyor.zip
試してみてください。
「cmakeビルドで SUPPORT_OLD_WINDOWS=ON のとき」の解説を。
SUPPORT_OLD_WINDOWS=ONでビルドすると、古いランタイムを使えるようにしたり、 Windows 9xで動くようにUnicode Win32 APIをエミュレートしたりなどの 工夫がプログラムに組み込まれます。
Tera Term 5 は Visual Studio 2022でビルドしてリリース予定なので(snapshotも2022でビルドしています) 古いWindowsで動く工夫を入れてもWindows7以降の動作となります。
Visual Studio でビルドしたバイナリの動作する環境
古いVisual Studioを使えば、従来のWinodwsでも動作させることができる可能性が高まります。 でも古いVisual Studioのプロジェクトファイルも使えるように保守し続けるのはとてもつらいので (Tera Term 4は多いときで7種類ぐらいのVisual Studioのプロジェクトファイルを保守していました) いまは、開発とリリースに使うVSのプロジェクトだけに絞っています。
cmake というツールを使うと色々なプロジェクトファイルを生成できます。 これで古いVisual StudioやMinGW(gccなど)を利用できるようにしています。 今のところ実験的な位置づけです。
現在、プロジェクトチームはTera Term 5を最新開発環境を優先して開発を進めているので、 以前のWindowsのサポートは後回しになっています。
確認が遅くなりました。r10665 で、このチケットで(わたしがいろいろ勝手に)推測した問題は全て再現しなくなっています。
修正ありがとうございました。 あとは、元投稿者さんのところでうまく動いてくれると良いですね。
投稿者です。申し訳ないです、確認遅くなりました。
恐らく本件は修正されて、別件チケットの内容かもしれないですが、HTTPプロキシを使用するとエラーとなる事象が発生しています。
r10646 OK
r10649 NG : プロキシの設定により接続できません。(HTTP: status code 403)
r10650 NG : プロキシの設定により接続できません。(HTTP: status code 403)
この場合は別チケットなどにした方がよいのでしょうか。 INIの以下の設定によるものです。
ProxyType="http" ProxyHost="xxx.xxx.xxx.xxx" ProxyPort="3128"
次の問題が残っていました。
r10682 で修正しました。
https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10683-20230418-appveyor.zip
このチケットの不具合はすべて対応できたと思います。
ryo_k さん、sempreff さんありがとうございました。
新たに問題が出てこなければ数日でクローズしようと思います。
Reply To zmatsuo
r10682 で修正しました。 https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10683-20230418-appveyor.zip
確認したところ問題なく動作しました。ありがとうございます。修正頂きまして助かりました。 派生のチケット Ticket #47869 もクローズしておきました。
proxyに関係あると思っていませんでした。 うまく動作するように元に戻ってよかったです。
/D=000c0f38 となるところが /D= 000c0f38 となってしまって、 000c0f38 が接続先ホストに名になっていたと思います。
引数に 「hosta hostb」と複数あった場合、後のほうが採用されるので、 000c0f38 は使われないように思うのですが…、proxy の動作には関係あったんですね。
ありがとうございました。 クローズします。
(匿名) への返信
Teraterm5 alpha/betaで発生します。Teratermマクロから以下の指定を行うと、指定された秘密鍵でのログインができません。 connect 'myserver /ssh /2 /auth=publickey /user=username /passwd=password /keyfile=private-key-file' 起動した画面上では「RSA/DSA/ECDSA/ED25519鍵を使う」のラジオボタンが選択されていますが、「秘密鍵(K)」が無効となっています。 「rhosts(SSH1)を使う」のラジオボタンのオプションのユーザーと鍵が有効化されています(ラジオボタンとオプションの有効状態が矛盾しています)。 ラジオボタンを選択しなおすとオプションの矛盾は解決し、鍵の指定を新たに出来ますが、マクロは「RSA/DSA/ECDSA/ED25519秘密鍵の含まれるファイルを指定してください」というTTSSHのエラーで止まってしまいます。 Teraterm4では動作するため、TTSSHのバグかと思われます。
参考になるかわかりませんが、Keyfileのパスに日本語が入っている場合上記エラーになります。パスから日本語を排除するとログインできました。
Teraterm5 alpha/betaで発生します。Teratermマクロから以下の指定を行うと、指定された秘密鍵でのログインができません。
connect 'myserver /ssh /2 /auth=publickey /user=username /passwd=password /keyfile=private-key-file'
起動した画面上では「RSA/DSA/ECDSA/ED25519鍵を使う」のラジオボタンが選択されていますが、「秘密鍵(K)」が無効となっています。 「rhosts(SSH1)を使う」のラジオボタンのオプションのユーザーと鍵が有効化されています(ラジオボタンとオプションの有効状態が矛盾しています)。 ラジオボタンを選択しなおすとオプションの矛盾は解決し、鍵の指定を新たに出来ますが、マクロは「RSA/DSA/ECDSA/ED25519秘密鍵の含まれるファイルを指定してください」というTTSSHのエラーで止まってしまいます。 Teraterm4では動作するため、TTSSHのバグかと思われます。