35

R 是否具有允许用户安全地提供密码的功能,例如 Python 的getpass模块?

(有关我的意思的示例,请参见http://docs.python.org/library/getpass.html )

4

5 回答 5

27

问题是 R 没有功能来控制它正在运行的终端(类似于Rncurses);这可能是由于便携性问题。
前段时间我在同样的问题上苦苦挣扎,最后我得到了一个使用 TclTk 的函数:

getPass<-function(){  
  require(tcltk);  
  wnd<-tktoplevel();tclVar("")->passVar;  
  #Label  
  tkgrid(tklabel(wnd,text="Enter password:"));  
  #Password box  
  tkgrid(tkentry(wnd,textvariable=passVar,show="*")->passBox);  
  #Hitting return will also submit password  
  tkbind(passBox,"<Return>",function() tkdestroy(wnd));  
  #OK button  
  tkgrid(tkbutton(wnd,text="OK",command=function() tkdestroy(wnd)));  
  #Wait for user to click OK  
  tkwait.window(wnd);  
  password<-tclvalue(passVar);  
  return(password);  
}  

当然,它不会在非 GUI 环境中工作。

于 2010-06-23T18:14:50.027 回答
6

终端安全密码问题的非常简单的 linux 概念:

   password <- function(prompt = "Password:"){
      cat(prompt)
      pass <- system('stty -echo && read ff && stty echo && echo $ff && ff=""',
                        intern=TRUE)
      cat('\n')
      invisible(pass)
   }        
于 2014-07-20T11:16:14.460 回答
5

根据上面评论中的m-dz,现在有一个名为getPass的包用于执行此操作,它只有一个函数getPass(). 这是base::readline().

在此处输入图像描述

于 2017-12-14T21:13:19.193 回答
3

我的包keyringr通过从底层操作系统密钥环(Windows 上的 DPAPI、OSX 上的 Keychain 和 Linux 上的 Gnome 密钥环)检索密码来解决这个问题。

插图详细说明了如何使用该软件包,但如果您使用的是 OSX 并且将密码保存在 Keychain 中,则可以使用以下命令将密码返回给 R(其中mydb_myuser是 Keychain 项名称):

install.packages("keyringr")
library("keyringr")
mypwd <- decrypt_kc_pw("mydb_myuser")
print(mypwd)
于 2017-01-03T01:37:23.507 回答
0

这是一个基于?modalDialog的登录弹出窗口。

library("shiny")

shinyApp(
  ui <- basicPage(
    actionButton("login", "Login"),
    verbatimTextOutput("secrets")
  ),

  server <- function(input, output, session) {
    vals <- reactiveValues(authenticated=FALSE)

    passwordModal <- function(message=NULL) {
      modalDialog(
        textInput("username", "Username", input$username),
        passwordInput("password", "Password", input$password),

        if (!is.null(message)) div(tags$b(message, style="color: red;")),

        footer = tagList(
          modalButton("Cancel"),
          actionButton("authenticate", "OK")
        )
      )
    }

    observeEvent(input$login, {
      showModal(passwordModal())
    })

    observeEvent(input$authenticate, {
      vals$authenticated <- FALSE
      if (!is.null(input$username) && nzchar(input$username) &&
          !is.null(input$password) && nzchar(input$password)) {
        removeModal()

        if (input$password == "letmein") {
          vals$authenticated <- TRUE
        } else {
          showModal(passwordModal(message="Incorrect password!"))
        }

      } else {
        showModal(passwordModal(message="Please fill in your username and password"))
      }
    })

    output$secrets <- renderText({
      if (vals$authenticated) {
        paste("Don't tell anyone, ", input$username, ", but...", sep="")
      } else {
        "I can't tell you that!"
      }
    })
  }
)
于 2017-06-08T14:34:15.617 回答