Решаем проблему Bad owner or permissions on C:\\Users\\USER/.ssh/config

Недавно случилась беда, мой любимы Visual Code перестал соединяться с удаленным сервером, ссылаясь на ошибку

Bad owner or permissions on C:\\Users\\USER/.ssh/config

В общем, звучит это в духе, что у нас нет прав на использование файлов внутри .ssh и попросту говоря, что мы не владельцы и система шлет нас н…уй, причем, шлют именно CMD и Powershell, которые используются Visual Code для удаленного соединения через плагин Remote SSH.

Решение этой непутевой ошибки довольно простое, для этого нужно клацать правой кнопкой мыши на файл .ssh/config и убрать все унаследованные права, проследуя командам Свойства -> Безопасность -> Дополнительно -> Убрать наследование -> Удалить все унаследованные разрешения от этого объекта

Предупреждение Warning message DNS SPOOFING DETECTED when SSHing into instances

Вы можете получить это сообщение, когда используете SSH в своем териминале:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED! @ 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for ec2-46-137-83-49.us-west-1.compute.amazonaws.com has changed, 
and the key for the corresponding IP address 10.56.63.182 
is unknown. This could either mean that 
DNS SPOOFING is happening or the IP address for the host 
and its host key have changed at the same time. 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! 
Someone could be eavesdropping on you right now (man-in-the-middle attack)! 
It is also possible that the RSA host key has just been changed. 
The fingerprint for the RSA key sent by the remote host is 
69:4e:bb:70:6a:64:e3:78:07:6f:b4:00:41:07:d8:9c.
Please contact your system administrator. 
Add correct host key in /home/deploy/.ssh/known_hosts to get rid of this message. 
Offending key in /home/deploy/.ssh/known_hosts:1 
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks. 

Эта последовательность событий может привести к появлению предупреждения:

  1. Создание экземпляра с IP-адресом.
  2. SSHing в этот экземпляр, никаких предупреждений не происходит (как и ожидалось).
  3. Отключение этого экземпляра.
  4. Создание нового экземпляра, присвоение ему ранее использованного IP-адреса.
  5. SSHing в этот новый экземпляр. Это когда появляется предупреждение.

Почему появляется это сообщение?

Когда вы создаете новый экземпляр, это новый виртуализированный компьютер. Поэтому, когда вы возвращаетесь к тому же IP-адресу, ваш компьютер распознает, что это не тот компьютер, который был раньше. Хотя в некоторых случаях это может указывать на злонамеренную активность, указанную в предупреждении, в этом сценарии она ожидается и в порядке.

Решение: отредактируйте файл .ssh / known_hosts

Отредактируйте файл .ssh/known_hosts и удалите строку, содержащую неисправный ключ.

  1. На вашем локальном компьютере откройте файл ~ / .ssh / known_hosts для редактирования.
  2. Удалите строку, содержащую ключ-нарушитель и соответствующий IP-адресу, указанному в предупреждении.
  3. В приведенном выше примере это первая строка файла (номер строки указывается после двоеточия в предупреждении «Ключ-нарушитель в /home/deploy/.ssh/known_hosts:»): ec2–46–137–83– 49.us-west–1.compute.amazonaws.com… jkEkIXAIRJQ ==

Перенос WordPress с Apache на Nginx + php-fpm

Для нам потребуется создать новый файл конфигурации сайта в папке sites-available со следующим содержимым

server {
        server_name example.com www.example.com;
        root /var/www/example.com/public_html;
        index index.php;
	access_log /var/www/example.com/logs/example.com.access.log;
	error_log /var/www/example.com/logs/example.com.error.log;
	
    location / {
      try_files $uri $uri/ /index.php?$args;
    }
	
    location ~ \.php$ {
        root /var/www/example.com/public_html;
        fastcgi_pass   unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }


    location ~ /\.ht {
      deny  all;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = wsofter.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;
    return 404; # managed by Certbot


}

Чтобы генерировать SSL сертификаты для домена можно почитать про сервисы для генерации на официальной странице или сразу же воспользоваться популярным клиентом для Linux Certbot.

Работа с сервером Nginx

Список постов на тему изучения сервера Nginx

  1. Введение в Nginx
  2. Об Nginx
  3. Nginx против Apache
  4. Установка Nginx с помощью менеджера пакетов
  5. Сборка Nginx из исходного кода
  6. Nginx в качестве сервиса и обновление кастомного билда
  7. Nginx под Windows и Linux
  8. Термины в настройках Nginx
  9. Блоки Location
  10. Логирование Nginx
  11. Наследование и типы директив Nginx
  12. Настройка воркеров Nginx и другие полезные директивы
  13. Динамические модули Nginx
  14. Заголовки Expires Nginx
  15. Gzip Nginx
  16. FastCGI Cache Nginx
  17. Лимиты в Nginx
  18. Стриминг видео Nginx
  19. GeoIP Nginx
  20. HTTP2 Nginx
  21. SSL Nginx
  22. Базовая аутентификация Nginx
  23. Повышение безопасности Nginx
  24. SSL сертификаты Let’s Encrypt
  25. Обратный прокси и балансировка нагрузки — подготовка
    • Обратный прокси-сервер
    • Балансировщик нагрузки

Краткий курс WPF

  1. Введение в WPF
    • Особенности WPF
    • Начало работы с WPF
  2. Язык программной разметки XAML
    • Введение XAML
    • Разделение частей проекта
    • Свойства и конвертеры типов XAML
    • Пространства имен XAML
  3. Компоновка элементов
    • Элемент компоновки Grid
    • Элемент компоновки GridSplitter
    • Элемент компоновки StackPanel
    • Элемент компоновки DockPanel
    • Элемент компоновки WrapPanel
    • Элемент компоновки Canvas
    • Свойства элементов компоновки
  4. Элементы управления
    • Общий обзор элементов управления XAML/WPF
    • Элементы управления содержимым
    • Элемент нажатия Button
    • Элемент выборки CheckBox
    • Элемент выборки RadioButton
    • Элемент всплывающий ToolTip
    • Элемент всплывающий Popup
    • Элемент контейнер GroupBox
    • Элемент контейнер Expander
    • Элемент прокрутки ScrollViewer
    • Элементы текста
    • Элемент списка ListBox
    • Элемент списка ListView
    • Элемент выпадающего списка ComboBox
    • Элемент вкладок TabControl
    • Элемент меню Menu
    • Элемент панели инструментов ToolBar
    • Элемент дерева TreeView
    • Элемент обработки данных DataGrid
    • Элемент прогресса ProgressBar
    • Элемент ползунка Slider
    • Элемент даты Calendar
    • Элемент даты DatePicker
    • Элемент изображений Image
    • Элемент рисования InkCanvas
  5. Работа с зависимостями
    • Свойства зависимостей DependencyObject
    • Прикрепляемые свойства
    • Создание свойств зависимостей
  6. События в WPF
    • Маршрутизация событий
    • События с клавиатуры
    • События мыши и фокуса
  7. Команды
    • Основы команд
    • Создание новых команд
  8. Кисти

Переменные и их типы в C(Си)

В C(Си) множество видов производных переменных. В данном посте познакомимся основными базовыми видами. Но прежде, чем перейти к типам, нужно разъяснить само понятие переменная. Общий вид объявления переменной выглядит так

char x;
   int a, b, c;
   unsigned long long y;

Общий принцип объявления

[модификаторы] спецификатор_типа идентификатор [, идентификатор] …

  • Модификаторы — ключевые слова signed, unsigned, short, long;
  • Спецификатор типа — ключевое слово char или int, определяющее тип объявляемой переменной;
  • Идентификатор — имя переменной.

Переменная в языке программирования похожа на переменные в математике с тем отличием, что в языке Си каждая переменная имеет тип данных, которая она может хранить, иначе говоря спецификатор. И роль этих переменных — это промежуточные хранения данных на всем цикле выполнения программы. Основные спецификаторы переменных делятся на

  1. char — символьный тип данных;
  2. int — целочисленных тип данных;
  3. short — целочисленный тип данных;
  4. long — целочисленный тип данных;
  5. bool — булевый тип данных для хранения TRUE или FALSE;
  6. float — число с плавающей точкой;
  7. double — число с плавающей точкой двойной точности;

Важно отметить, что числовые переменные могут еще быть отрицательными ли абсолютными. Для указания абсолютности или возможности быть отрицательными у переменных есть ключевые слова, которые еще называются модификаторы

  • signed — есть отрицательные и положительные (стоит по умолчанию);
  • unsigned — есть только положительные;
  • short — это, еще может быть короткой записью типа short int;
  • long — это, еще может быть короткой записью типа long int;

Если цифровая переменная указана, как signed, то диапазон положительных чисел делится поровну с отрицательными, потому что старший бит уходит на указание знака числа.

ТипДиапазонШестнадцатиричный диапазонРазмер
unsigned char0 … 2550x00 … 0xFF8 bit
signed char 
или просто
char
-128 … 127-0x80 … 0x7F8 bit
unsigned short int
или просто
unsigned int или unsigned short
0 … 655350x0000 … 0xFFFF16 bit
signed short int или signed int
или просто
short или int
-32768 … 327670x8000 … 0x7FFF16 bit
unsigned long int
или просто
unsigned long
0 … 42949672950x00000000 … 0xFFFFFFFF32 bit
signed long
или просто
long
-2147483648 … 21474836470x80000000 … 0x7FFFFFFF32 bit
unsigned long long0 … 184467440737095516150x0000000000000000 … 0xFFFFFFFFFFFFFFFF64 bit
signed long long
или просто
long long
-9223372036854775808 … 92233720368547758070x8000000000000000 … 0x7FFFFFFFFFFFFFFF64 bit

Ввод и вывод данных в C(Си)

Ввод и вывод данных — это один из основных этапов цикле жизни приложения. Т.е., на всем протяжении, пока приложение работает он принимает некоторые данные и выдает результат вычисления и наша задача — это придумать некоторый алгоритм на языке C(Си), который обработает эти данные так, как нам нужно и выдаст результат. Для простого консольного приложения на языке C(Си) можно воспользоваться 2 соответствующими функциями из стандартного заголовочного файла stdio.h

  1. printf() — функция вывода на консоль в форматированном виде;
  2. scanf() — функция чтения с клавиатуры в форматированном виде;

Для усвоения темы придумаем пример приложения, который запуститься и будет ожидать ввод с клавиатуры, а после ввода обработает введенное значение и завершит программу

#include 

char message[20];
int main(int args, char * vargs[])
{
   scanf("%s", &message[0]);
   printf("My first app with %s \n", message);
}

В данном код мы определяем переменную, которая будет хранить вводимую строку и после ввода эта строка будет склеена с текстом в printf() и будет выведена на экран. Результат будет следующим

Результат ввода и вывода данных в программу

Компиляция и запуск исходного кода на C(Си) в Linux

По умолчанию в десктопной версии Ubuntu или в Debian должен быть установлен компилятор GNU GCC в папке usr/bin/gcc. Для проверки того, что он у вас есть можно выполнить следующие команды

$ whereis gcc
$ which gcc
$ gcc --version

Если этого всего нет, то следует установить по следующим командам

$ sudo apt-get update
$ sudo apt-get install build-essential manpages-dev

Компиляция исходника

Чтобы компилировать исходник нам сначала нужно написать некоторый код на C(Си)

#include <stdio.h>
/* main.c:  My first C program on a Linux */
int main(void)
{
   printf("Hello! This is a test prgoram.\n");
   return 0;
}

и выполнить команду компиляции одним из способов

$ cc main.c -o main

или

$ gcc main.c -o main

или, предполагая, что в текущей директории есть файл main.c

$ make main

или

$ cc main.c -o main

или, предполагая, что в текущей директории есть файл main.c

$ make main

Если в коде нет ошибок, то компилятор выполнит свою работу и в текущей директории появится исполняемый файл main , наличие которого можно проверить через команду

$ ls -l main*

В противном случае, придется найти ошибку в коде и исправить.

Запуск скомпилированного приложения

Для запуска в скомпилированного файла достаточно выполнить команду

$ ./main

или

$ /path/to/main

Проверка строки JSON на ошибки в PHP

<?php
// Верная json-строка
$json[] = '{"Organization": "PHP Documentation Team"}';

// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ' вместо "
$json[] = "{'Organization': 'PHP Documentation Team'}";


foreach ($json as $string) {
    echo 'Декодируем: ' . $string;
    json_decode($string);

    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            echo ' - Ошибок нет';
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Достигнута максимальная глубина стека';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Некорректные разряды или несоответствие режимов';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Некорректный управляющий символ';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Синтаксическая ошибка, некорректный JSON';
        break;
        case JSON_ERROR_UTF8:
            echo ' - Некорректные символы UTF-8, возможно неверно закодирован';
        break;
        default:
            echo ' - Неизвестная ошибка';
        break;
    }

    echo PHP_EOL;
}