ProxyCommand без socat, nc или перенаправления TCP Bash?

Примечание: Это было протестировано на ноутбуке с i915 управляемая видеокарта.


Фон

Примечание: Когда новый экран включается, никакое событие не отправляется в хост, это осталось верным даже после моего последнего редактирования. Таким образом, единственный путь состоит в том, чтобы использовать опрос. Попытка сделать их максимально эффективными...

РЕДАКТИРОВАНИЕ № 3

Наконец существует одно лучшее решение (через ACPI):

Нет все еще никакого события, но ACPI кажется более эффективным, чем xrandr запросить. (Nota: Это требует загруженных модулей ядра ACPI, но не требует полномочий пользователя root).

Мое конечное решение (использующий удар):

isVgaConnected() {
    local crtState
    read -a < /proc/acpi/video/VID/CRT0/state crtState
    test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}

Теперь тест:

$ if isVgaConnected; then echo yes; else echo no; fi 
yes

Это включается, поэтому теперь я отключаю его:

$ if isVgaConnected; then echo yes; else echo no; fi 
no

Примечание: ${1:+*-1+1} разрешите булев аргумент: Если бы что-то присутствует, ответ был бы инвертирован: ( crtState >> 4 ) * -1 + 1.

и заключительный сценарий:

#!/bin/bash

export crtProcEntry=/proc/acpi/video/VID/CRT0/state

isVgaConnected() {
    local crtState
    read -a < $crtProcEntry crtState
    test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}

delay=.1
unset switch
isVgaConnected || switch=not
while :;do
    while isVgaConnected $switch;do
        sleep $delay
      done
    if [ "$switch" ];then
        unset switch
        echo VGA IS connected
        # doing something while VGA is connected
      else
        switch=not
        echo VGA is NOT connected.
        # doing something else, maybe.
      fi
  done

ПРЕДУПРЕЖДЕНИЯ: легче, чем xrandr, но весьма важный с задержкой, меньшей, чем 0,02 секунды, сценарий Bash перейдет к вершине процесса едоков ресурса (top)!

В то время как это стоит ~0.001 секунд:

$ time read -a 

Это требует ~0.030 секунд:

$ read -a < /proc/acpi/video/VID/CRT0/state crtState

Это является большим! Таким образом в зависимости от того, в чем Вы нуждаетесь, delay мог быть обоснованно установлен между 0.5 и 2.

РЕДАКТИРОВАНИЕ № 2

Я наконец нашел что-то, с помощью этого:

Важная правовая оговорка: Проигрывание с /proc и /sys записи могли повредить Вашу систему!!! Не пробуйте следующий производственные системы.

mapfile watchFileList < <(
    find /sys /proc -type f 2>/dev/null |
    grep -i acpi\\\|i91 
)

prompt=("/" "|" '\' '-');

l=0
while :; do
  mapfile watchStat < <(
    grep -H . ${watchFileList[@]} 2>/dev/null
  )

  for ((i=0;i<=${#watchStat[@]};i++)); do
    [ "${watchStat[i]}" == "${oldStat[i]}" ] || echo ${watchStat[i]}
  done

  oldStat=("${watchStat[@]}")
  sleep .5
  printf "\r%s\r" ${prompt[l++]}
  [ $l -eq 4 ]&&l=0
done

... после некоторой очистки нежелательных записей:

for ((i=0;i<=${#watchFileList[@]};i++)); do
  [[ "${watchFileList[$i]}" =~ /sys/firmware/acpi/interrupts/sci ]] &&
      unset watchFileList[$i] && echo $i
done

Я смог считать это:

/proc/acpi/video/VID/CRT0/state:state: 0x1d
/proc/acpi/video/VID/CRT0/state:state: 0x0d
/proc/acpi/video/VID/CRT0/state:state: 0x1d

Когда я включаю, отключаю, и переразъем в кабеле монитора.

Исходный ответ

Когда конфигурация запрашивается (выполнение system/preferences/monitor или xrandr), видеокарты делают тип сканирования, таким образом работая xrandr -q дайте Вам информацию, но необходимо запросить состояние.

Я просканировал все журналы, (ядро, демон, X и т.д) поиск /proc & /sys, и ясно ничто, кажется, не существует, который удовлетворяет Ваш запрос.

Я попробовал это также:

export spc50="$(printf "%50s" "")"
watch -n1  '
    find /proc/acpi/video -type f |
        xargs grep -H . |
        sed "s/^\([^:]*):/\1'$spc50'}:/;
             s/^\(.\{50\}\) *:/\1 /"'

В конце концов, это, если Вы работаете System/Preferences/Monitor в то время как никакой новый экран не был просто включен, ни отключен, инструмент будет появляться просто (обычно). Но если Вы включили или отключили экран прежде, время от времени Вы будете выполнять этот инструмент, и Вы будете видеть, что Ваш рабочий стол делает тип сброса или обновления (то же, если Вы будете работать xrandr).

Это, кажется, подтверждает, что этот инструмент просит xrandr (или работы таким же образом), запрашивая состояние периодически, начиная в то время, когда это выполняется.

Вы могли судить себя:

$ for ((i=10;i--;)); do xrandr -q | grep ' connected' | wc -l; sleep 1; done
1
1
1
2
2
2
1
1
1
1

Это отобразится, сколько экранов (дисплеи) соединено, в течение 10 секунд.

В то время как это работает, включите и/или отключите свой экран/монитор и посмотрите, что, происходит. Таким образом, Вы могли создать немного тестовой функции Bash:

isVgaConnected() {
    local xRandr=$(xrandr -q)
    [ "$xRandr" == "${xRandr#*VGA1 con}" ] || return 0
    return 1
}

который был бы применим как в:

$ if isVgaConnected; then echo yes; fi

Но будьте осторожны, xrandr занимает приблизительно 0,140 секунды к 0.200 секундам, в то время как никакого изменения не происходит на разъемах и до 0.700 секунд каждый раз, когда что-то было включено или отключено незадолго до (ПРИМЕЧАНИЕ: Это, кажется, не едок ресурса).

РЕДАКТИРОВАНИЕ № 1

Для обеспечения я не преподаю что-то неправильное, я искал вокруг сети и документов, но ничего не нашел о DBus и Экранах.

Наконец, я работал в двух различных окнах dbus-monitor --system (Я играл с опциями также), и небольшой сценарий, который я записал:

$ for ((i=1000;i--;)); do isVgaConnected && echo yes || echo no; sleep .5; done

... и снова включенный, чем отключенный монитор, много раз. Таким образом, теперь я мог сказать:

  • В этой конфигурации, с помощью i915 драйвер, нет никакого другого пути, чем выполнение xrandr -q знать, включается ли монитор или нет.

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

Некоторые документы

8
09.12.2013, 19:24
1 ответ

Если ssh на стороне прокси является достаточно новым (> = OpenSSH 5.4), можно использовать -W опция, которая работает подобная, чем nc. Добавьте к соответствующей записи в Вашем .ssh/config файл:

ProxyCommand ssh -W %h:%p PROXYHOST

Пример:

Host TARGETHOST
  ProxyCommand ssh -W %h:%p PROXYHOST
  HostName 10.0.0.1
13
27.01.2020, 20:10
  • 1
    , если PROXYHOST берет другого пользователя, чем TARGETHOST, можно указать его в конце ProxyCommand с -l <proxyuser>. И для TARGETHOST Вы указываете его на другой строке с User <targetuser> –  Ciprian Tomoiagă 20.12.2016, 13:09

Теги

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