2010-05-26 4 views

Antwort

27

Das Problem ist, dass R nicht funktioniert hat, das Terminal steuern es in (so etwas wie Rncurses) ausgeführt wird; Wahrscheinlich liegt das an Portabilitätsproblemen.
Vor einiger Zeit mit dem gleichen Problem, das ich zu kämpfen habe und ich mit einer Funktion TclTk endete:

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); 
} 

Natürlich ist es nicht in Nicht-GUI-Umgebungen arbeiten.

+0

Funktioniert tadellos wie annonciert. Vielen Dank! – A5C1D2H2I1M1N2O1R2T1

+0

Gefunden nur das in einer 'getPass :: getPass()' Funktion implementiert. –

5

Sehr einfaches Linux-Konzept für Terminal sicheren Passwort Frage:

password <- function(prompt = "Password:"){ 
     cat(prompt) 
     pass <- system('stty -echo && read ff && stty echo && echo $ff && ff=""', 
         intern=TRUE) 
     cat('\n') 
     invisible(pass) 
    }   
+0

Funktioniert nicht für mich. Minze 18.2. ''> Passwort() Passwort: stty: 'Standard-Eingang': Ungültige ioctl für Gerät Warnmeldung: Running-Befehl 'STTY-Echo && lesen ff & & Stty Echo & & echo $ ff && ff = ""' hatte status 1 '' ' – Deleet

1

Mein Paket keyringr löst dieses Problem, indem sie Passwörter aus dem zugrunde liegenden Betriebssystem Schlüsselbund (DPAPI unter Windows, Schlüsselanhängern auf OSX und der Gnome Keyring auf Linux Abrufen).

Die vignette gibt eine detaillierte Erklärung, wie das Paket zu verwenden, aber wenn Sie OSX wurden verwenden und das Passwort im Schlüsselbund gespeichert haben, können Sie den folgenden Befehl verwenden, um das Passwort zu R zurückzukehren (wo mydb_myuser das ist Schlüsselanhänger Artikelname):

install.packages("keyringr") 
library("keyringr") 
mypwd <- decrypt_kc_pw("mydb_myuser") 
print(mypwd) 
+0

Ich bekomme' Fehler: Sys.info() ["sysname"] == "Darwin" ist nicht wahr ". Was bedeutet das? Sollte ich 'Alt-rechts' drücken? –

+0

Welches Betriebssystem verwenden Sie? Bitte melden Sie ein Problem unter github.com/jgilfillan/keyringr an. Vielen Dank. –

+0

'" Darwin "ist nicht wahr" ist unter Windows. –

0

Hier ist ein Login Pop-up, basierend auf ?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!" 
     } 
    }) 
    } 
) 
1

Per m-dz in den Kommentaren oben gibt es ein jetzt ein Paket, dies zu tun getPass genannt, die eine einzige Funktion, getPass(). Dies ist ein Ersatz für base::readline().

enter image description here

Verwandte Themen