Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 42 additions & 41 deletions components/ts_console/commands/ts_cmd_ssh.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/

#include "ts_console.h"
#include "ts_i18n.h"
#include "ts_api.h"
#include "ts_log.h"
#include "ts_core.h" /* TS_MALLOC_PSRAM, TS_STRDUP_PSRAM */
Expand Down Expand Up @@ -1530,56 +1531,56 @@ static int ssh_cmd_handler(int argc, char **argv)

/* 显示帮助 */
if (s_ssh_args.help->count > 0) {
ts_console_printf("\nUsage: ssh [options]\n\n");
ts_console_printf("SSH client for remote operations\n\n");
ts_console_printf("Connection Options:\n");
ts_console_printf(" --host <ip> Remote host address\n");
ts_console_printf(" --port <num> SSH port (default: 22)\n");
ts_console_printf(" --user <name> Username\n");
ts_console_printf(" --password <pwd> Password (for password auth)\n");
ts_console_printf(" --key <path> Private key file (for public key auth)\n");
ts_console_printf(" --keyid <id> Use key from secure storage (see 'key' command)\n");
ts_console_printf(" --exec <cmd> Execute command on remote host\n");
ts_console_printf(" --shell Open interactive shell\n");
ts_console_printf(" --forward <spec> Port forwarding: L<local>:<remote_host>:<remote_port>\n");
ts_console_printf(" --test Test SSH connection\n");
ts_console_printf(" --timeout <sec> Connection timeout in seconds (default: 10)\n");
ts_console_printf(" --verbose Show detailed output\n");
ts_console_printf("\nKey File Management:\n");
ts_console_printf(" --keygen Generate SSH key pair to file\n");
ts_console_printf(" --copyid Deploy public key to remote server\n");
ts_console_printf(" --revoke Remove public key from remote server\n");
ts_console_printf(" --type <type> Key type: rsa, rsa2048, rsa4096, ecdsa, ec256, ec384\n");
ts_console_printf(" --output <path> Output file path for private key\n");
ts_console_printf(" --comment <text> Comment for the public key\n");
ts_console_printf("\nGeneral:\n");
ts_console_printf(" --help Show this help\n");
ts_console_printf("\nExamples:\n");
ts_console_printf(" # Generate RSA key pair to file\n");
ts_console_printf(" ssh --keygen --type rsa2048 --output /sdcard/id_rsa\n");
ts_console_printf("\n%s\n\n", TS_STR(TS_STR_SSH_HELP_USAGE));
ts_console_printf("%s\n\n", TS_STR(TS_STR_SSH_HELP_DESC));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_CONN_OPTS));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_HOST));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_PORT));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_USER));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_PASSWORD));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_KEY));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_KEYID));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EXEC));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_SHELL));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_FORWARD));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_TEST));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_TIMEOUT));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_VERBOSE));
ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_KEY_MGMT));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_KEYGEN));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_COPYID));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_REVOKE));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_TYPE));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_OUTPUT));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_COMMENT));
ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_GENERAL));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_HELP_OPT));
ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_EXAMPLES));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEYGEN));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEYGEN_CMD));
ts_console_printf(" \n");
ts_console_printf(" # Connect using stored key (manage keys with 'key' command)\n");
ts_console_printf(" key --list # List stored keys\n");
ts_console_printf(" key --generate --id agx --type rsa # Generate RSA key\n");
ts_console_printf(" ssh --host 192.168.1.100 --user nvidia --keyid agx --shell\n");
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_STORED));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEY_LIST));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEY_GEN));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_SSH));
ts_console_printf(" \n");
ts_console_printf(" # Deploy public key to remote server (using secure storage key)\n");
ts_console_printf(" ssh --copyid --host 192.168.1.100 --user nvidia --password pw --keyid agx\n");
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_COPYID));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_COPYID_CMD));
ts_console_printf(" \n");
ts_console_printf(" # Revoke (remove) deployed public key from remote server\n");
ts_console_printf(" ssh --revoke --host 192.168.1.100 --user nvidia --password pw --keyid agx\n");
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_REVOKE));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_REVOKE_CMD));
ts_console_printf(" \n");
ts_console_printf(" # Or deploy using file-based key\n");
ts_console_printf(" ssh --copyid --host 192.168.1.100 --user nvidia --password pw --key /sdcard/id_rsa\n");
ts_console_printf("\nNote: Key management has moved to the 'key' command. Use 'key --help' for details.\n");
ts_console_printf(" Use 'hosts' command to manage known hosts.\n");
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_FILE));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_FILE_CMD));
ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_NOTE));
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_NOTE_HOSTS));
return 0;
}

/* 参数错误检查 */
if (nerrors > 0) {
arg_print_errors(stderr, s_ssh_args.end, "ssh");
ts_console_printf("Use 'ssh --help' for usage information\n");
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_USE));
return 1;
}

Expand Down Expand Up @@ -1754,7 +1755,7 @@ static int ssh_cmd_handler(int argc, char **argv)
result = do_ssh_test(host, port, user, &auth, timeout);
} else {
ts_console_printf("Error: Specify --exec, --shell, --forward, --test, or --keygen\n");
ts_console_printf("Use 'ssh --help' for usage information\n");
ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_USE));
result = 1;
}

Expand Down
46 changes: 43 additions & 3 deletions components/ts_console/include/ts_i18n.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@ extern "C" {
typedef enum {
TS_LANG_EN = 0, /**< English (default) */
TS_LANG_ZH_CN, /**< Simplified Chinese */
TS_LANG_ZH_TW, /**< Traditional Chinese */
TS_LANG_JA, /**< Japanese */
TS_LANG_KO, /**< Korean */
TS_LANG_MAX
} ts_language_t;

Expand Down Expand Up @@ -109,6 +106,49 @@ typedef enum {
TS_STR_SHUTTING_DOWN,
TS_STR_REBOOT_IN,

/* Help messages */
TS_STR_HELP_USE_CMD, /**< "Use '<command> --help' for command details" */
TS_STR_SSH_HELP_USE, /**< "Use 'ssh --help' for usage information" */
TS_STR_SSH_HELP_USAGE,
TS_STR_SSH_HELP_DESC,
TS_STR_SSH_HELP_CONN_OPTS,
TS_STR_SSH_HELP_HOST,
TS_STR_SSH_HELP_PORT,
TS_STR_SSH_HELP_USER,
TS_STR_SSH_HELP_PASSWORD,
TS_STR_SSH_HELP_KEY,
TS_STR_SSH_HELP_KEYID,
TS_STR_SSH_HELP_EXEC,
TS_STR_SSH_HELP_SHELL,
TS_STR_SSH_HELP_FORWARD,
TS_STR_SSH_HELP_TEST,
TS_STR_SSH_HELP_TIMEOUT,
TS_STR_SSH_HELP_VERBOSE,
TS_STR_SSH_HELP_KEY_MGMT,
TS_STR_SSH_HELP_KEYGEN,
TS_STR_SSH_HELP_COPYID,
TS_STR_SSH_HELP_REVOKE,
TS_STR_SSH_HELP_TYPE,
TS_STR_SSH_HELP_OUTPUT,
TS_STR_SSH_HELP_COMMENT,
TS_STR_SSH_HELP_GENERAL,
TS_STR_SSH_HELP_HELP_OPT,
TS_STR_SSH_HELP_EXAMPLES,
TS_STR_SSH_HELP_EX_KEYGEN,
TS_STR_SSH_HELP_EX_KEYGEN_CMD,
TS_STR_SSH_HELP_EX_STORED,
TS_STR_SSH_HELP_EX_KEY_LIST,
TS_STR_SSH_HELP_EX_KEY_GEN,
TS_STR_SSH_HELP_EX_SSH,
TS_STR_SSH_HELP_EX_COPYID,
TS_STR_SSH_HELP_EX_COPYID_CMD,
TS_STR_SSH_HELP_EX_REVOKE,
TS_STR_SSH_HELP_EX_REVOKE_CMD,
TS_STR_SSH_HELP_EX_FILE,
TS_STR_SSH_HELP_EX_FILE_CMD,
TS_STR_SSH_HELP_NOTE,
TS_STR_SSH_HELP_NOTE_HOSTS,

TS_STR_MAX
} ts_string_id_t;

Expand Down
7 changes: 7 additions & 0 deletions components/ts_console/src/ts_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/

#include "ts_console.h"
#include "ts_i18n.h"
#include "ts_log.h"
#include "esp_console.h"
#include "esp_vfs_dev.h"
Expand Down Expand Up @@ -249,6 +250,12 @@ esp_err_t ts_console_init(const ts_console_config_t *config)
return ESP_ERR_INVALID_STATE;
}

/* Initialize i18n (loads system.language from config for help/ssh --help etc.) */
esp_err_t i18n_ret = ts_i18n_init();
if (i18n_ret != ESP_OK) {
return i18n_ret;
}

/* Use defaults if no config provided */
if (config) {
s_console.config = *config;
Expand Down
10 changes: 2 additions & 8 deletions components/ts_console/src/ts_console_builtin.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static int cmd_help(int argc, char **argv)
}
}

ts_console_printf("Use '<command> --help' for command details\n\n");
ts_console_printf("%s\n\n", TS_STR(TS_STR_HELP_USE_CMD));

return 0;
}
Expand Down Expand Up @@ -288,9 +288,6 @@ static int cmd_lang(int argc, char **argv)
ts_console_printf("\nAvailable languages:\n");
ts_console_printf(" en - %s\n", ts_i18n_get_language_name(TS_LANG_EN));
ts_console_printf(" zh-cn - %s\n", ts_i18n_get_language_name(TS_LANG_ZH_CN));
ts_console_printf(" zh-tw - %s\n", ts_i18n_get_language_name(TS_LANG_ZH_TW));
ts_console_printf(" ja - %s\n", ts_i18n_get_language_name(TS_LANG_JA));
ts_console_printf(" ko - %s\n", ts_i18n_get_language_name(TS_LANG_KO));
ts_console_printf("\nCurrent: %s\n\n", ts_i18n_get_language_name(ts_i18n_get_language()));
return 0;
}
Expand All @@ -302,9 +299,6 @@ static int cmd_lang(int argc, char **argv)

if (strcmp(lang_str, "en") == 0) lang = TS_LANG_EN;
else if (strcmp(lang_str, "zh-cn") == 0 || strcmp(lang_str, "zh") == 0) lang = TS_LANG_ZH_CN;
else if (strcmp(lang_str, "zh-tw") == 0) lang = TS_LANG_ZH_TW;
else if (strcmp(lang_str, "ja") == 0) lang = TS_LANG_JA;
else if (strcmp(lang_str, "ko") == 0) lang = TS_LANG_KO;
else {
ts_console_error("Unknown language: %s\n", lang_str);
ts_console_printf("Use 'lang -l' to list available languages\n");
Expand Down Expand Up @@ -378,7 +372,7 @@ static int cmd_log(int argc, char **argv)
esp_err_t ts_console_register_builtin_cmds(void)
{
/* Initialize lang command arguments */
s_lang_args.lang = arg_str0(NULL, NULL, "<language>", "Language code (en/zh-cn/zh-tw/ja/ko)");
s_lang_args.lang = arg_str0(NULL, NULL, "<language>", "Language code (en/zh-cn)");
s_lang_args.list = arg_lit0("l", "list", "List available languages");
s_lang_args.end = arg_end(2);

Expand Down
Loading