Ответы пользователя по тегу Linux
  • Почему в iptables пусто, а в netstat не все порты?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    iptables не имеет никакого отношения к тому, какие порты могут быть открыты. iptables управляет тем, как сетевые пакеты проходят через сетевой стек.
    Ответ написан
  • Как в bash для strace программы аргументы в строке разделять?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Лучшее известное мне решение -- с помощью массива:

    args=("--param1=value1" "--param2=value with spaces")
    "$cmd" "${args[@]}"


    Каждый элемент массива будет передан одним параметром.
    Ответ написан
  • Почему не компилируется код на ассемблере в gcc?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    перекомпилируйте с параметром -fPIC
    gcc -fPIC ./hello.s

    "перекомпилируйте" в данном контексте означает "сгенерируйте другой ассемблерный код".

    Код программы выглядит так:

    Ну это же явно 32-битный код, компилируй его под 32 бита:
    gcc -m32 hello.s -o hello
    Ответ написан
  • Про BlackArch, стоит ли учить\устанавливать?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Сразу хочу сказать, что я хорошо ознакомлен с Linux, так что ознакомиться с BlackArch мне будет не очень трудно.

    Если бы ты был реально "хорошо ознакомлен", ты бы поставил этот blackarch в песочницу, поигрался бы, нашёл ответы на свои вопросы и возможно по пути отправил бы баг-репорт разработчикам. И не было бы этого вопроса.

    не поймите меня неправильно

    Вместо того, чтобы заниматься делом ты "познаёшь системы" с "проффесиональным интерфейсом" и строчишь о своих муках выбора вопросы на тостер, я тебя правильно понял?
    Ответ написан
  • Как удалиить папки вместе с файлами в Shell скрипте?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Помогите подкорректировать скрипт, чтобы удалялись не только файлы но и папки внутри.

    Легко:
    find /volume1/Swap/ -depth -mindepth 1 -mtime +0 -delete
    Ответ написан
  • Как запустить на Linux 64 bit программы 32 bit, пишет что запускаемые файла это пустое место?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Доустановить 32-битное окружение -- libc и всё остальное, что программа использует. Детали зависят от дистрибутива.
    Пример для debian:
    dpkg --add-architecture i386
    apt-get update
    apt-get install libc6:i386
    Ответ написан
  • Как скриптом в Linux синхронизировать время с указанием своего Часового пояса?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Как скриптом в Linux синхронизировать время с указанием своего Часового пояса?

    Никак же, внутреннее время в Linux -- всегда в UTC. Для синхронизации часов TZ не нужна.
    TZ -- это обычная переменная окружения, влияет она только на С-функции работающие с датой/временем и на одной машине разные сессии вполне могут иметь разные настройки TZ.
    Установить её для ash можно в /etc/profile или ~/.profile.
    Ответ написан
  • Почему не работает ALT-CTRL-Fx?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Захожу в консоль по SSH через Putty. Хочу переключиться к примеру на TTY2. Нажимаю CTRL+ALT+F2, но в консоли только [12~
    Что я делаю не так?

    ctrl-alt-f2 -- это сочетание клавиш для драйвера виртуального терминала. Соответственно, оно работает только при вводе через виртуальный терминал.

    Под простым юзером ввожу chvt 2:
    Если под рутом, то команда выполняется и всё
    Что я делаю не так?

    В графической консоли вводишь? С помощью strace легко понять что происходит:
    от простого юзера:
    $ strace -iv chvt 2
    ...
    [00007f96b99d56f0] open("/proc/self/fd/0", O_RDWR) = 3
    [00007f96b99da80a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f96b99db017] ioctl(3, KDGKBTYPE, 0x7fff06db6d67) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f96b99d5f30] close(3)             = 0
    [00007f96b99d56f0] open("/dev/tty", O_RDWR) = 3
    [00007f96b99da80a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f96b99db017] ioctl(3, KDGKBTYPE, 0x7fff06db6d67) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f96b99d5f30] close(3)             = 0
    [00007f96b99d56f0] open("/dev/tty0", O_RDWR) = -1 EACCES (Permission denied)
    ...

    Т..е. stdin и /dev/tty не поддерживают ioctl переключающий терминал (вернее, до него даже не доходит), потому что твоя консоль -- это псевдотерминал, а открыть /dev/tty0 не хватает привилегий.
    А от рута:
    $ sudo strace chvt 2
    ...
    [00007f591848c6f0] open("/proc/self/fd/0", O_RDWR) = 3
    [00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f591848cf30] close(3)             = 0
    [00007f591848c6f0] open("/dev/tty", O_RDWR) = 3
    [00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f591848cf30] close(3)             = 0
    [00007f591848c6f0] open("/dev/tty0", O_RDWR) = 3
    [00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5, c_oflags=0, c_cflags=0xbf, c_lflags=0, c_line=0, c_cc[VMIN]=1, c_cc[VTIME]=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = 0
    [00007f5918492017] ioctl(3, VT_ACTIVATE, 0x2) = 0
    [00007f5918492017] ioctl(3, VT_WAITACTIVE, 0x2) = 0
    ...

    Т.е. stdin и /dev/tty -- то же самое, но /dev/tty0 открывается и ioctl VT_ACTIVATE проходит.
    Ответ написан
  • Как низкоуровневый код использующий стек узнает откуда он начинается?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Если взять за основу эту схему, то становится понятно, как код процесса может узнать адреса текста, инициализированных данных, неинициализированных данных

    Если мы говорим про обычные (не PIE) исполняемые ELF-файлы, то они слинкованы под конкретный адрес куда они будут загружены, и все адреса внутри одного исполняемого файла посчитаны заранее. Поэтому загрузка адреса функции или пременной в секции данных -- это просто загрузка константы в регистр.

    и кучи

    С кучей всё по-другому, потому что куча и объекты в ней полностью динамические. Выделение памяти для кучи -- это всегда системный вызов, который возвращает адрес выделенной памяти (и sbrk, и mmap).

    не ясно, как становится известен адрес стека и аргументов командной строки

    они инициализируются ядром ОС, согласно ABI, см. например, ABI x86_64, раздел 3.4.1.
    Ответ написан
  • Как решить проблему в Bash?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    if [ -s file.txt ]
    then
    echo "File is empty"

    Неправильный тест:
    -s FILE
                  FILE exists and has a size greater than zero


    Правильный тест на файл нулевого размера наверно будет выглядеть так:
    if [ -f file.txt -a ! -s file.txt ]

    Но тогда и дальнейшая логика в else посыплется, потому что ветка else будет теперь означать "нет файла, не обычный файл, или файл ненулевого размера".
    Ответ написан
  • Как тестировать драйвера?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Сразу скажу, комп у меня слабенький и ждать 3-4 часа чтоб понять что забыл в конце оператора точку с запятой поставить, это не хорошо?!

    При разработке необязательно использовать конфигурацию ядра со всеми включёнными опциями. Типичный конфиг который я использую при разработке собирается с нуля за 2 минуты.
    Кроме того, ядерный Makefile понимает цели вида *.o. Т.е. можно взять и откомпилировать один файл из дерева исходников ядра. Например: make init/main.o.
    Если ты меняешь что-то в исходниках, перекомпилироваться будет только то, что действительно зависит от того, что ты поменял. Поменяешь .c -- перекомпилируется единственный соответствующий ему файл .o.

    как можно тестировать компоненты ядра

    Это совсем другой вопрос. Под просто тестированием понимают проверку того, что код работает правильно, а не то, что он собрался.
    Ответ написан
  • Почему появляется ошибка segmentation fault но при повторном запуске программы её нет?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Я не вижу криминала который мог бы привести к segfault в приведённой программе.
    Почему поведение может отличаться между запусками -- например потому что запись в файл /sys/class/gpio/export меняет состояние системы и запоминается между запусками.
    Кроме того, согласно https://www.kernel.org/doc/Documentation/gpio/sysfs.txt в direction надо писать in или out, а high или low нужно писать в value. Сегфолта от этого быть не должно, тем не менее.

    Что происходит, если собрать программу с отладочной информацией и запустить так, чтобы она упала под отладчиком?

    UPD: посмотрел ещё немного... В приведённом исходном тексте кривые юникодные кавычки. Рекомендую исправить на ASCII, либо вставить исходный текст как есть, без фокусов.
    Ответ написан
  • Как в Xfce4, Mate отключить кнопки тачпада?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Как отключить кнопки тачпада?

    командой xinput.

    Я использую такой скрипт:
    #! /bin/bash
    
    MODEL='Synaptics TouchPad'
    xinput disable  `xinput list | sed -n "/$MODEL/s/.*id=\([0-9]*\).*$/\1/p"`
    Ответ написан
  • Где найти актуальную версию arm тулчейна?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Видишь ли в чём дело, если ты используешь тулчейн сильно отличный от того, которым собраны библиотеки установленные на устройство, у тебя есть три варианта действий:
    - перестроить и обновить все библиотеки на устройстве.
    - создать отдельную иерархию каталогов /lib, /usr/lib, ... в которые сложить библиотеки (.so) нового тулчейна и тем или иным способом заставить исполняемые файлы собранные новым тулчейном использовать их.
    - линковать свои исполняемые файлы статически.

    В последнем варианте тебе подойдёт почти любой тулчейн, два других варианта -- более замороченные.

    https://elinux.org/Toolchains#Prebuilt_toolchains
    Ответ написан
  • Как правильно экранировать одиночные кавычки в linux?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    как экранировать одинарные кавычки

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

    Оригинальный запрос можно написать так:
    grep -rnw /home/user/ -e "\$_GET['s']"
    но в любом случае он выглядит проблематично: $ в регулярке -- это конец строки, квадратные скобки -- это символ из набора...
    Ответ написан
  • Thinstation как добавить xorg7-radeon?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Я ничего не знаю про thinstation, но древний драйвер в X11 называется radeonhd, см. https://www.x.org/releases/individual/driver/
    Ответ написан
  • Что обозначают эти строки в ассемблере?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    .file "main.c"
    Зачем в коде название файла с исходным кодом

    Для генерации отладочной информации в формате DWARF.

    .ident "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
    ...и версия моей убунты?

    Это не версия твоей убунты, это строка идентификации компилятора, в которой оказалось имя твоей ОС.

    Попадают ли они в исполняемый файл при окончательно компиляции и зачем используются?


    Имена файлов попадают в таблицу символов как символы типа FILE и в секцию отладочной информации:
    $ readelf -a hello | grep FILE
        28: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
        37: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS hello.c
        38: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
        41: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS


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

    Идентификационная строка компилятора попадает в секцию .comment объектного файла, а оттуда -- в исполняемый файл:
    $ objdump -s -j .comment hello
    
    hello:     file format elf64-x86-64
    
    Contents of section .comment:
     0000 4743433a 20284465 6269616e 20362e33  GCC: (Debian 6.3
     0010 2e302d31 382b6465 62397531 2920362e  .0-18+deb9u1) 6.
     0020 332e3020 32303137 30353136 00        3.0 20170516.


    Всё это можно от исполняемого файла отрезать командой strip, objcopy или соответствующим скриптом линковщика.
    Ответ написан
  • Почему поле fd в событии epoll_event не задано?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    e.data.fd = cfd;
    e.data.ptr = (void*)cfd;


    epoll_data -- это union, не нужно его инициализировать сначала одним, а потом другим:
    typedef union epoll_data {
                   void    *ptr;
                   int      fd;
                   uint32_t u32;
                   uint64_t u64;
               } epoll_data_t;
    
               struct epoll_event {
                   uint32_t     events;    /* Epoll events */
                   epoll_data_t data;      /* User data variable */
               };


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

    в документации сказано, что там должно быть значение, которое было в поле data во время вызова epoll_ctl.

    Кроме того, 0 -- вполне нормальный файловый дескриптор.
    Короче, я попробовал, у меня работает. Если у тебя не работает -- приведи весь код.
    Ответ написан
  • Запуск программы в Linux x64?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Есть ли подобные статьи для 64-бит архитектуры?

    Зачем? В этой статье почти нет процессорной специфики -- там описаны потроха С-рантайма, библиотеки С и динамического линковщика. Любая программа на С для любой архитектуры при запуске проходит через те же стадии.
    Ответ написан