По-видимому, существует уловка для создания логинов sshfs только для чтения с атрибутом только для чтения, который принудительно применяется удаленным ~/.ssh/authorized_keys
файл.
Вы сначала создаете программу ~/.ssh/ro-sftp-server
это работает sftp-server -R
, какие бы ни были другие варианты. Затем вы настраиваете свой ограниченный ключ ssh, как обычно, на пульте дистанционного управления. ~/.ssh/authorized_keys
файл, кроме добавления ограничения команды:
no-X11-forwarding,no-agent-forwarding,no-pty,command= “~/.ssh/ro-sftp-server” ssh-rsa ...
Наконец, вы монтируете каталог, вызывая sshfs
.
sshfs -o ssh_command="ssh -i ~/.ssh/ro_key" \
-o sftp_server="~/.ssh/ro-sftp-server" \
-o idmap=mrmeow -o ro \
mrmeow@example.com:. ~/www/
Большой! Как теперь разрешить запись, но только после запроса пароля?
Я бы точно мог сделать autofs
смонтировать второе чтение-запись sshfs
том по запросу, используя защищенный паролем, но неограниченный ключ.
Наконец, мне понадобятся unionfs, mhddfs или аналогичные, чтобы этот второй каталог отображался поверх первого, за исключением по-видимому Мне нужно, чтобы они оба были честно установлены. :(
Есть идеи о том, как добиться этого «запроса пароля при записи»? функциональность?
Fuse не сможет предложить вам пароль на терминале, потому что у него нет к нему доступа. Возможно, вы сможете заставить Fuse угадывать ваш X-дисплей и блокировать ввод-вывод, пока он выдает запрос пароля графического интерфейса. Некоторые среды рабочего стола (Gnome / KDE) предоставляют средства кошелька для разблокировки ключей; к ним может быть полезно подключиться.
Но для простоты могу предложить альтернативу. Возможно, где-то в вашем рабочем процессе вы сможете проверить необходимость записи и вызвать запрос с помощью сценария.
Например, если вы используете Vim, вы можете проверить, прежде чем писать файл:
autocmd BufWritePre *.c \
let targetfile = expand('%') | \
if !filewritable(targetfile) | \
exec "!~/bin/prompt_remount_foo_rw" | \
end
Или в фантастическом процессе сборки Coffeescript вы можете действовать соответствующим образом после ошибок записи:
buildProcess.on "error", (e) ->
if e.writeError
prompt_remount_foo_rw().then(retryBuild)
Чтобы получить приглашение в одном терминале без X, потребуется поддержка любого программного обеспечения, которое вы используете для записи.