OpenSSH - автоматическое создание закрытых и открытых ключей сервера

Bash использует переменные intmax_t для арифметики. В вашей системе они имеют длину 64 бита, поэтому:

$ echo $((1<<62))
4611686018427387904

- это

100000000000000000000000000000000000000000000000000000000000000

в двоичном формате (1, за которой следуют 62 0). Снова сдвиньте:

$ echo $((1<<63))
-9223372036854775808

что равно

1000000000000000000000000000000000000000000000000000000000000000

в двоичном формате (63 0), в арифметике с двумя дополнениями.

Чтобы получить самое большое представимое целое число, нужно вычесть 1:

$ echo $(((1<<63)-1))
9223372036854775807

что в двоичном исчислении равно

111111111111111111111111111111111111111111111111111111111111111

-.

Как указано в ilkkachu в ответе, на 64-битных x86 процессорах (будь то RCL или SHL) сдвиг происходит по модулю 64, что объясняет наблюдаемое вами поведение:

$ echo $((1<<64))
1

эквивалентно $((1. Таким образом, $((1 - это $((1, $((1 - это $((1...

Определения типов и максимальные значения вы найдете в stdint.h; в вашей системе:

/* Largest integral types.  */
#if __WORDSIZE == 64
typedef long int                intmax_t;
typedef unsigned long int       uintmax_t;
#else
__extension__
typedef long long int           intmax_t;
__extension__
typedef unsigned long long int  uintmax_t;
#endif

/* Minimum for largest signed integral type.  */
# define INTMAX_MIN             (-__INT64_C(9223372036854775807)-1)
/* Maximum for largest signed integral type.  */
# define INTMAX_MAX             (__INT64_C(9223372036854775807))

2
16.05.2017, 01:03
1 ответ

В Debian повторное создание ключей хоста может произойти с помощью:

rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
1
27.01.2020, 22:18

Теги

Похожие вопросы