Попытка отправить пароль через сценарий ожидания в sshfs

У меня есть сервер с 2fa и не позволяет войти в систему с помощью ключей ssh. Я хочу подключиться через FTP, я использую sshfs. Обычный sshfs user@host:/remote/ /local/ работает нормально. Но я хотел передать пароль с помощью expect (-o password_stdin у меня не работает).

Я определил функцию в .bashrc

function mount_sshfs_with_2fa() {

  # Get the FTP password from the encrypted file
  local password=$(gpg --decrypt encrypted_password.txt)

  # Prompt for verification code
  read -p "Verification code: " otp
  echo $otp

  expect << EOF
    spawn sshfs user@host:/remote/ /local/
    expect -re "code:"
    send -- "$otp\r"
    send_user "Verification code: $otp\n"
    expect -re "Password:"
    send -- "$password\r"
    send_user "Password: $password\n"

EOF
}

Ошибки не выдает, но и не монтируется. Пожалуйста, скажите мне, что случилось.

отлаживать

expect -d дает

Verification code: 325776
325776
expect version 5.45.4
argv[0] = expect  argv[1] = -d  
set argc 0
set argv0 "expect"
set argv ""
executing commands from command file
spawn sshfs user@host:/remote/ /local/
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {153497}

expect: does "" (spawn_id exp4) match glob pattern "code:"? no
Verification code: 
expect: does "\rVerification code: " (spawn_id exp4) match glob pattern "code:"? yes
expect: set expect_out(0,string) "code:"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "\rVerification code:"
send: sending "325776\r" to { exp4 }

expect: does " " (spawn_id exp4) match glob pattern "assword:"? no


expect: does " \r\n" (spawn_id exp4) match glob pattern "assword:"? no
Password: 
expect: does " \r\n\rPassword: " (spawn_id exp4) match glob pattern "assword:"? yes
expect: set expect_out(0,string) "assword:"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " \r\n\rPassword:"
send: sending "(my password)\r" to { exp4 }

обновление 2 Вместо здесь-кода также не работает следующее

expect -c "
    spawn sshfs user@host:/remote/ /local/
    expect "code:"
    send -- "$otp\r"
    expect "assword:"
    send -- "$password\r"
    interact
  "

expect это что-то серьезное или просто пустая трата времени? Я видел несколько решений, которые работали для других, и у меня возникла ошибка! Например, interact не работает внутри expect здесь-кода?

Я удивлен, что OTP запрашивается перед паролем. Тем не менее, мы ожидаем показать вам, что он делает: expect -d << EOF

glenn jackman 11.05.2023 18:10

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

glenn jackman 11.05.2023 18:10

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

deltasata 11.05.2023 18:12

Я думал, что это должно быть стандартным использованием, кроме. Что делать тогда?

deltasata 11.05.2023 19:53

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

sexpect - Expect for Shells 12.05.2023 12:26

Самая распространенная ошибка может заключаться в том, что вы забыли вызвать «ожидание eof» в конце скрипта. :)

sexpect - Expect for Shells 12.05.2023 12:27

Попробуйте мой секспект. Его поведение по умолчанию более удобно для пользователя (например, в большинстве случаев можно забыть о eof).

sexpect - Expect for Shells 12.05.2023 12:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Следует отметить одну вещь: когда heredoc заканчивается (в EOF), процесс ожидания завершается, и процесс sshfs будет убит.

Вам нужно продолжать ожидать запуска, и вы, вероятно, захотите запустить его в фоновом режиме:

function mount_sshfs_with_2fa() {

  # Get the FTP password from the encrypted file
  local password=$(gpg --decrypt encrypted_password.txt)

  # Prompt for verification code
  read -p "Verification code: " otp

  {
    expect << EOF
      spawn sshfs user@host:/remote/ /local/
      expect -re {Verification code: $}
      send -- "$otp\r"
      expect -re {Password: $}
      send -- "$password\r"
      set timeout -1
      expect eof
EOF
  } &
}

Я немного запутался здесь, я ожидаю, что sshfs продолжит работать в фоновом режиме даже после остановки ожидания!

deltasata 11.05.2023 20:19

И что, если это был просто ssh?

deltasata 11.05.2023 20:28

Что происходит, когда вы запускаете sshfs из командной строки? Вы вводите свой OTP и пароль, и что дальше?

glenn jackman 11.05.2023 22:55

Оно работает. После sshfs user@host:/remote/ /local/ (и предоставления otp и пароля) он монтируется и возвращается к $.

deltasata 11.05.2023 23:03

Кстати, вышеуказанное решение не работает. Я никогда не думал, что передать пароль может быть так сложно!

deltasata 11.05.2023 23:12
Ответ принят как подходящий

Скорее всего, его убил SIGHUP. Попробуйте так:

expect << EOF
    spawn -ignore SIGHUP sshfs user@host:/remote/ /local/

    set timeout -1

    expect -re "code:"
    send -- "$otp\r"
    expect -re "Password:"
    send -- "$password\r"

    expect eof
    sleep 1
EOF

Я не знаю как, но это работает! Большое спасибо!

deltasata 12.05.2023 11:47

технически говоря, sshfs (если он хорошо реализован) должен быть невосприимчив к SIGHUP (исходящему от tty) после того, как он запустится в фоновом режиме. но кто знает. :)

pynexj 12.05.2023 11:54

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