Как переключить аудиовыходы аудиоустройства из CLI?

Это sudo позволяет вам разрешать только определенные команды - это не единственное преимущество sudo over su.

В большинстве магазинов это даже не самое важное преимущество.

С помощью sudo вы знаете, кто выполнил определенную команду.

Теперь, может быть, Это важно для вас. Например, вы можете быть единственным пользователем вашего компьютера. Если это так, то sudo, возможно, не лучше, чем su.

Но у большого количества хостов более одного администратора.

sudo тогда становится очень полезным, потому что если кто-то делает неправильную вещь , sudo позволяет узнать, кто это сделал.

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

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

Судо не совершенен.

Если два человека одновременно выполняют «sudo sh», тогда может быть сложно присвоить команды одному или другому.

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

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

Но это дает вам гораздо больше шансов предотвратить повторение.

4
задан 6 March 2018 в 23:29

3 ответа

Благодаря обсуждению с @Thomas я понял, что правильные термины (ключевые слова) - это профиль и карта. В терминах профилей вопросов используются входы и выходы. Карты - это аудиоустройства.

Мы можем найти все доступные профили для каждого имени карты командой pacmd list-cards или pactl list cards, которая выводит ту же информацию: [!d10 ]

$ pactl list cards

Card #0
    Name: alsa_card.pci-0000_00_1b.0
    ...
    Profiles:
        input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority: 60, available: yes)
        output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 6000, available: yes)
        output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority: 6060, available: yes)
        output:analog-surround-21: Analog Surround 2.1 Output (sinks: 1, sources: 0, priority: 800, available: yes)
        ...
    Active Profile: output:iec958-stereo+input:analog-stereo
    ...

Card #1
    Name: alsa_card.pci-0000_03_00.1
    ...
    Profiles:
        output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes)
        output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (sinks: 1, sources: 0, priority: 5200, available: yes)
        output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
        output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
        ...
    Active Profile: output:hdmi-stereo
    ...

Определенный профиль может быть задан командой с форматом следующим образом:

pactl set-card-profile output:hdmi-stereo <card name|number> <profile name>

В соответствии с вопросом для четырех упомянутых выходов команды:

pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo # LG ULTRAWIDE
pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo-extra1 # LG TV
pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:iec958-stereo # Digital Output
pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo # Headphones

Как показано в @Thomas , когда установлен новый профиль, следующие вещи:

 pacmd set-default-sink <sink number of the target profile>
 pacmd move-sink-input "$i" <sink number of the target profile> 
 # where $i is the index number of any active input: pacmd list-sink-inputs   

Согласно моему , описанный в вопросе, я создал следующий скрипт:

#!/bin/bash

# Name: /usr/local/bin/audioswitch
# Usage: audioswitch; audioswitch 1; audioswitch 2;  audioswitch 3; audioswitch 4

CARD_1="pci-0000_03_00.1"             ### HDMI Audio Controller of NVidia GTX 660
CARD_1_PROFILE_1="hdmi-stereo"          # LG ULTRAWIDE
CARD_1_PROFILE_2="hdmi-stereo-extra1"   # LG TV
CARD_0="pci-0000_00_1b.0"             ### Built-in Audio
CARD_0_PROFILE_1="iec958-stereo"        # Digital Output
CARD_0_PROFILE_2="analog-stereo"        # Headphones

# Read the user's input
CHOICE="${@}"
choice() {
    if   [ "$CHOICE" == 1 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_1" # LG ULTRAWIDE
    elif [ "$CHOICE" == 2 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_2" # LG TV
    elif [ "$CHOICE" == 3 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_1" # Digital Output
    elif [ "$CHOICE" == 4 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_2" # Headphones
    else
        echo -e "\nYou should choice between:"
        echo -e "\n\t[1] LG ULTRAWIDE\n\t[2] LG TV\n\t[3] Digital Output\n\t[4] Headphones\n"
        echo -n "Your choice: "; read CHOICE; echo; choice; # call the function again
    fi
}; choice # call the function

# Set the choosen card profile as sink
pactl set-card-profile "alsa_card.${CARD}" "output:${PROF}";

# Set the default sink to the new one
pacmd set-default-sink "alsa_output.${CARD}.${PROF}" &> /dev/null

# Redirect the existing inputs to the new sink
for i in $(pacmd list-sink-inputs | grep index | awk '{print $2}'); do
    pacmd move-sink-input "$i" "alsa_output.${CARD}.${PROF}" &> /dev/null
done

Сценарий готов к использованию с пользовательскими комбинациями клавиш, поскольку он может обрабатывать значение (1 - ) первого позиционного параметра. Когда он будет вызван без дополнительного параномера, он попросит вашего выбора:

$ audioswitch 

You should choice between:

    [1] LG ULTRAWIDE
    [2] LG TV
    [3] Digital Output
    [4] Headphones

Your choice: 1
2
ответ дан 22 May 2018 в 12:46

Благодаря обсуждению с @Thomas я понял, что правильные термины (ключевые слова) - это профиль и карта. В терминах профилей вопросов используются входы и выходы. Карты - это аудиоустройства.

Мы можем найти все доступные профили для каждого имени карты командой pacmd list-cards или pactl list cards, которая выводит ту же информацию:

$ pactl list cards Card #0 Name: alsa_card.pci-0000_00_1b.0 ... Profiles: input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority: 60, available: yes) output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 6000, available: yes) output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority: 6060, available: yes) output:analog-surround-21: Analog Surround 2.1 Output (sinks: 1, sources: 0, priority: 800, available: yes) ... Active Profile: output:iec958-stereo+input:analog-stereo ... Card #1 Name: alsa_card.pci-0000_03_00.1 ... Profiles: output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes) output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (sinks: 1, sources: 0, priority: 5200, available: yes) output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes) output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes) ... Active Profile: output:hdmi-stereo ...

Определенный профиль может быть задан командой с форматом следующим образом:

pactl set-card-profile output:hdmi-stereo <card name|number> <profile name>

В соответствии с вопросом для четырех упомянутых выходов команды:

pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo # LG ULTRAWIDE pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo-extra1 # LG TV pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:iec958-stereo # Digital Output pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo # Headphones

Как показано в @Thomas , когда установлен новый профиль, следующие вещи:

pacmd set-default-sink <sink number of the target profile> pacmd move-sink-input "$i" <sink number of the target profile> # where $i is the index number of any active input: pacmd list-sink-inputs

Согласно моему , описанный в вопросе, я создал следующий скрипт:

#!/bin/bash # Name: /usr/local/bin/audioswitch # Usage: audioswitch; audioswitch 1; audioswitch 2; audioswitch 3; audioswitch 4 CARD_1="pci-0000_03_00.1" ### HDMI Audio Controller of NVidia GTX 660 CARD_1_PROFILE_1="hdmi-stereo" # LG ULTRAWIDE CARD_1_PROFILE_2="hdmi-stereo-extra1" # LG TV CARD_0="pci-0000_00_1b.0" ### Built-in Audio CARD_0_PROFILE_1="iec958-stereo" # Digital Output CARD_0_PROFILE_2="analog-stereo" # Headphones # Read the user's input CHOICE="${@}" choice() { if [ "$CHOICE" == 1 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_1" # LG ULTRAWIDE elif [ "$CHOICE" == 2 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_2" # LG TV elif [ "$CHOICE" == 3 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_1" # Digital Output elif [ "$CHOICE" == 4 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_2" # Headphones else echo -e "\nYou should choice between:" echo -e "\n\t[1] LG ULTRAWIDE\n\t[2] LG TV\n\t[3] Digital Output\n\t[4] Headphones\n" echo -n "Your choice: "; read CHOICE; echo; choice; # call the function again fi }; choice # call the function # Set the choosen card profile as sink pactl set-card-profile "alsa_card.${CARD}" "output:${PROF}"; # Set the default sink to the new one pacmd set-default-sink "alsa_output.${CARD}.${PROF}" &> /dev/null # Redirect the existing inputs to the new sink for i in $(pacmd list-sink-inputs | grep index | awk '{print $2}'); do pacmd move-sink-input "$i" "alsa_output.${CARD}.${PROF}" &> /dev/null done

Сценарий готов к использованию с пользовательскими комбинациями клавиш, поскольку он может обрабатывать значение (1 - 4) первого позиционного параметра. Когда он будет вызван без дополнительного параномера, он попросит вашего выбора:

$ audioswitch You should choice between: [1] LG ULTRAWIDE [2] LG TV [3] Digital Output [4] Headphones Your choice: 1
2
ответ дан 17 July 2018 в 19:34

Благодаря обсуждению с @Thomas я понял, что правильные термины (ключевые слова) - это профиль и карта. В терминах профилей вопросов используются входы и выходы. Карты - это аудиоустройства.

Мы можем найти все доступные профили для каждого имени карты командой pacmd list-cards или pactl list cards, которая выводит ту же информацию:

$ pactl list cards Card #0 Name: alsa_card.pci-0000_00_1b.0 ... Profiles: input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority: 60, available: yes) output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 6000, available: yes) output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority: 6060, available: yes) output:analog-surround-21: Analog Surround 2.1 Output (sinks: 1, sources: 0, priority: 800, available: yes) ... Active Profile: output:iec958-stereo+input:analog-stereo ... Card #1 Name: alsa_card.pci-0000_03_00.1 ... Profiles: output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes) output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (sinks: 1, sources: 0, priority: 5200, available: yes) output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes) output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes) ... Active Profile: output:hdmi-stereo ...

Определенный профиль может быть задан командой с форматом следующим образом:

pactl set-card-profile output:hdmi-stereo <card name|number> <profile name>

В соответствии с вопросом для четырех упомянутых выходов команды:

pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo # LG ULTRAWIDE pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo-extra1 # LG TV pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:iec958-stereo # Digital Output pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo # Headphones

Как показано в @Thomas , когда установлен новый профиль, следующие вещи:

pacmd set-default-sink <sink number of the target profile> pacmd move-sink-input "$i" <sink number of the target profile> # where $i is the index number of any active input: pacmd list-sink-inputs

Согласно моему , описанный в вопросе, я создал следующий скрипт:

#!/bin/bash # Name: /usr/local/bin/audioswitch # Usage: audioswitch; audioswitch 1; audioswitch 2; audioswitch 3; audioswitch 4 CARD_1="pci-0000_03_00.1" ### HDMI Audio Controller of NVidia GTX 660 CARD_1_PROFILE_1="hdmi-stereo" # LG ULTRAWIDE CARD_1_PROFILE_2="hdmi-stereo-extra1" # LG TV CARD_0="pci-0000_00_1b.0" ### Built-in Audio CARD_0_PROFILE_1="iec958-stereo" # Digital Output CARD_0_PROFILE_2="analog-stereo" # Headphones # Read the user's input CHOICE="${@}" choice() { if [ "$CHOICE" == 1 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_1" # LG ULTRAWIDE elif [ "$CHOICE" == 2 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_2" # LG TV elif [ "$CHOICE" == 3 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_1" # Digital Output elif [ "$CHOICE" == 4 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_2" # Headphones else echo -e "\nYou should choice between:" echo -e "\n\t[1] LG ULTRAWIDE\n\t[2] LG TV\n\t[3] Digital Output\n\t[4] Headphones\n" echo -n "Your choice: "; read CHOICE; echo; choice; # call the function again fi }; choice # call the function # Set the choosen card profile as sink pactl set-card-profile "alsa_card.${CARD}" "output:${PROF}"; # Set the default sink to the new one pacmd set-default-sink "alsa_output.${CARD}.${PROF}" &> /dev/null # Redirect the existing inputs to the new sink for i in $(pacmd list-sink-inputs | grep index | awk '{print $2}'); do pacmd move-sink-input "$i" "alsa_output.${CARD}.${PROF}" &> /dev/null done

Сценарий готов к использованию с пользовательскими комбинациями клавиш, поскольку он может обрабатывать значение (1 - 4) первого позиционного параметра. Когда он будет вызван без дополнительного параномера, он попросит вашего выбора:

$ audioswitch You should choice between: [1] LG ULTRAWIDE [2] LG TV [3] Digital Output [4] Headphones Your choice: 1
2
ответ дан 23 July 2018 в 20:18

Другие вопросы по тегам:

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