2010-05-26 4 views

Répondre

27

Le problème est que R n'a pas de fonctions pour contrôler le terminal, il est en cours d'exécution en (quelque chose comme Rncurses); c'est probablement dû à des problèmes de portabilité.
quelque temps que je luttais il y a le même problème et je me suis retrouvé avec une fonction à l'aide 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); 
} 

Bien sûr, il ne fonctionnera pas dans des environnements non-GUI.

+0

Fonctionne parfaitement comme annoncé. Merci! – A5C1D2H2I1M1N2O1R2T1

+0

Je viens de trouver ceci implémenté dans une fonction 'getPass :: getPass()'. –

5

Très simple concept linux pour la question de mot de passe sécurisé terminal:

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

Ne fonctionne pas pour moi. Menthe 18.2. '' '> motdepasse() Mot de passe: stty: 'entrée standard': ioctl inapproprié pour le périphérique Message d'avertissement: commande en cours 'stty -echo && read ff && stty echo && echo $ ff && ff =" "' status 1 '' ' – Deleet

1

Mon paquet keyringr résout ce problème en récupérant les mots de passe du trousseau de clés du système d'exploitation sous-jacent (DPAPI sous Windows, porte-clés sur OSX et le trousseau de clés Gnome sous Linux).

Le vignette donne une explication détaillée sur la façon d'utiliser le package, mais si vous utilisez Mac OS X et que vous avez le mot de passe enregistré dans le trousseau, vous pouvez utiliser la commande suivante pour retourner le mot de passe à R (où mydb_myuser est le nom de l'élément porte-clés):

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

Je reçois' Erreur: Sys.info() ["sysname"] == "Darwin" n'est pas TRUE'. Qu'est-ce que ça veut dire? Dois-je appuyer sur Alt-Right? –

+0

Quel système d'exploitation utilisez-vous? Veuillez enregistrer un problème sur github.com/jgilfillan/keyringr. Merci. –

+0

'" Darwin "n'est pas TRUE' est sur Windows. –

0

Voici une connexion pop-up, basée sur ?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

par m-dz dans les commentaires ci-dessus, il est maintenant un paquet pour ce faire appelé getPass, qui a une seule fonction, getPass(). Ceci est un remplacement pour base::readline().

enter image description here

Questions connexes